файлы списка tar, перерыв в первом файле

Я использовал следующий фрагмент, извлеченный из аналогичного сообщения – https://unix.stackexchange.com/a/101273/212793 – чтобы получить имя файла из файла tar.gz :

 tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' 

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

 tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' | grep -e "^..*my-file-name\\.ext$" 

Ключевой частью является то, что мой .tar.gz очень большой и содержит много файлов. Тем не менее, каждый из них имеет аналогичный «хэш», добавленный к началу (отсюда часть ^..* моего регулярного выражения grep'd).

Таким образом, файлы могут выглядеть так:

 - 4b77e4e1_file-a.ext - 4b77e4e1_file-b.ext - 4b77e4e1_file-c.ext # ect. 

Я заметил, что команда для получения всех файлов ( tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' ) передает результат.

Моя мысль заключается в том, что если я могу «сломать» поток, а затем извлечь эту первую хеш-часть, я смогу создать свое имя файла, которое мне в итоге понадобится, без необходимости прокручивать все содержимое файла .tar.gz .

Поэтому мой вопрос заключается в том , как я могу «разбить» awk на его первом выходе, в отличие от ожидания завершения всей команды (которая занимает несколько минут) и grepping результата, чтобы получить имя файла, которое в конечном итоге я хочу .

EDIT : Похоже, я действительно хочу сломать tar , так как просто exit после первого результата не изменит время выполнения.

3 Solutions collect form web for “файлы списка tar, перерыв в первом файле”

попробуйте что-нибудь вроде

  tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /my-filename$/ {print $NF ; exit }' 

или

  tar tzf "archive.tar.gz" | awk -F/ 'substr($NF,4,11) == "my-filename" {print $NF ; exit }' 

(где 4 и 11 должны совпадать с фактическим именем файла).

Вы можете сказать AWK выйти после печати что-то:

 awk -F/ '$NF != "" { print $NF; exit }' 

Поскольку вы ищете определенное имя файла:

 awk -F/ '/my-file-name\.ext$/ && $NF != "" { print $NF; exit }' 

Тест $NF избыточен, тогда:

 awk -F/ '/my-file-name\.ext$/ { print $NF; exit }' 

Если одна из программ в конвейере выйдет, то программы слева от нее также выйдут. Как это работает:

  • В foo | bar foo | bar , выходы из bar .
  • Выход из процесса закрывает считываемый конец трубы.
  • Когда foo пытается записать в трубу, он получает сигнал SIGPIPE.
  • foo умирает.

Это предполагает, что foo не защищен от SIGPIPE; программы могут это сделать, но типичные программы командной строки этого не делают.

Поскольку вы хотите только один матч, сделайте выход awk, как только он найдет интересующую вас строку:

 tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}' 

или (здесь не очень выгодно)

 tar tzf "archive.tar.gz" | sed -n '/[^/]my-file-name\.ext$/ {s!.*/!!; q}' 

или, придерживаясь вашего более сложного подхода использования grep отдельно от awk

 tar tzf "archive.tar.gz" | awk -F/ '{ if($NF != "") print $NF }' | grep -e "^..*my-file-name\\.ext$" | head -n 1 

Выход из считывателя приводит к тому, что tar выходит, когда он записывает в следующий канал, что может занять некоторое время из-за буферизации вывода . (Это займет особенно много времени, если на трубе будет более двух процессов, поскольку для каждого из них будет получена задержка SIGPIPE.) После выхода awk find будет тратить немного времени на чтение архива и заполнение следующего буфера с именами файлов, затем, наконец, попытайтесь записать буфер и быть убитым с помощью SIGPIPE. Для этого приложения, скорее всего, будет быстрее переключить tar для буферизации строк для вывода, что вы можете сделать с stdbuf :

 stdbuf -oL tar tzf "archive.tar.gz" | awk -F/ '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}' 

В качестве альтернативы вы можете договориться о том, чтобы убить программу tar, когда awk выйдет, но это сложнее.

 sh -m 'tar tzf "archive.tar.gz" | { awk -F/ "$0"; kill -TERM -$$; }' '$NF ~ /.my-file-name\.ext$/ {print $NF; exit}' [ $? -eq 143 ] 
  • Является ли архивирование всей файловой системы из корня эффективной стратегией резервного копирования?
  • Tar удаленный каталог без ведущих ./ на файлы
  • Почему моя смола не работает?
  • Как заставить tar жестко привязать идентичный контент «на лету» во время создания архива?
  • Могу ли я автоматизировать многотомную функцию tar?
  • рекурсивный поиск и печать последнего файла tar.gz в каждом каталоге
  • Найти файлы с тем же именем, но с разными расширениями, отправить в tgz
  • По соглашению, куда пакеты идут, чтобы установить на другие машины?
  • Как я могу спрятать вложенные файлы .tar.gz?
  • Архив для корневой файловой системы с быстрым произвольным доступом
  • передавая переменные от 'ls' до 'tar' через 'xargs'
  • Interesting Posts

    Fedora 23 GUI Login Double Echo

    Что происходит с этой темой при запуске Eclipse?

    Установка портативной пакетной системы (PBS) для подачи заявки

    Шифрованная файловая система в VirtualBox

    Почему файлы в моем домашнем каталоге создаются как общедоступные, несмотря на более ограничительную umask?

    Копирование или перенаправление текста в качестве входа в UART, необходимо обеспечить более медленную пропускную способность

    Bash – Как перебирать подкаталоги и извлекать файлы

    Ограничить кеш-память, используемую командой

    Как узнать, когда была запущена / остановлена ​​/ перезапущена служба systemd?

    чтение cifs share не разрешено с разрешенным разрешением – запрещено разрешение каталога samba samba

    В чем разница между «sort -u» и «sort | уник»?

    Какова цель случайного изображения для пользовательских (не хостов) SSH-ключей?

    Полноэкранные уведомления GNOME

    Ошибка проверки орфографии в LibreOffice Word 4.1.2.3 в Linux Mint 16 Petra

    компиляция PHP 5.4 и выше с MySQL

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