Самый быстрый способ найти, существует ли файл в нескольких 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 который его содержит.

  • Восстановление поврежденного tarball
  • find -exec ls -lR {} \; возвращает каждый элемент дважды
  • фильтр в «find» игнорируется при выходе, подаваемом в tar
  • Загрузите файл с любой из двух машин с помощью SCP?
  • Упаковка с смолой
  • tar + rsync + untar. Любое преимущество по скорости только за rsync?
  • Как показать индикатор выполнения в то время, когда tar рекурсивно?
  • Проверка вывода для конкретных расширений в выражении if
  • One Solution collect form web for “Самый быстрый способ найти, существует ли файл в нескольких tarballs?”

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

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

     tar tvf oneofthe.tar > oneofthe.tar.lst 

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

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