Самый быстрый способ найти, существует ли файл в нескольких tarballs?

Есть ли более эффективный способ сделать это, кроме использования tar tf и проверки вывода каждого файла на файл, который я ищу?

Так я делаю это прямо сейчас, но это очень медленно (есть около 600-1000 архивов, которые соответствуют search_patterns ):

 ARRAY=() ARRAY[0]=/path/to/archives/*search_pattern1* ARRAY[1]=/path/to/archives/*search_pattern2* ARRAY[2]=/path/to/archives/*search_pattern3* for f in ${ARRAY[@]} do if [[ $f =~ "matching_pattern1" ]]; then if tar -tf "$f" | grep "matching_pattern2" ; then printf "%s\n" $f; exit 0; fi fi done 

Для того, что это стоит, мои search_patterns – 3 последовательных дня, и я хочу сначала найти архивы, соответствующие matching_pattern1 а затем просмотреть все эти архивы для matching_pattern2 и вывести файл tar который его содержит.

  • Как передать файлы, загруженные с помощью wget через tar?
  • tar: исключить gzip-файл и не пытаться его уничтожить
  • Как создать детерминированный tar.gz с помощью git-архива?
  • Как создать резервную копию из символических ссылок?
  • Почему ленточное устройство, например «/ dev / st0», не использует команды типа «cp» для копирования содержимого?
  • использование случайных в tar для распаковки файлов
  • Безопасно ли рекурсивное сжатие с помощью tar, gzip и pigz?
  • Восстановление поврежденного tarball
  • One Solution collect form web for “Самый быстрый способ найти, существует ли файл в нескольких tarballs?”

    У tar-файлов нет каталога (например, zip-файл). Таким образом, сделать tar tf – единственное, что вы можете сделать.

    Если вам нужно запускать это несколько раз, то, конечно, вы можете перечислить содержимое каждого файла tar в файле и выполнить поиск по нему:

     tar tvf oneofthe.tar > oneofthe.tar.lst 

    Я бы даже сделал это, если есть небольшой шанс перепрограммировать поиск, так как это едва ли медленнее сделать это сначала, а затем искать вместо поиска (например, с помощью grep) на выходе tar tf

    Linux и Unix - лучшая ОС в мире.