У меня есть файл tgz со следующей файловой структурой

- folder
    - subdir1
      - file1.txt
      - file2.text
    - subdir2
      - file1.txt

Когда я запускаю tar -tf folder.tgz, он выводит следующее:

folder/
folder/subdir1/
folder/subdir1/file1.txt
folder/subdir1/file2.txt
folder/subdir2/
folder/subdir2/file1.txt

Как я могу исключить имена каталогов, чтобы выводимый список был:

folder/subdir1/file1.txt
folder/subdir1/file2.txt
folder/subdir2/file1.txt
2
alpha787 7 Ноя 2021 в 20:19
7
tar -tf folder.tgz | grep -v /$
 – 
Bib
7 Ноя 2021 в 20:30
5
Пожалуйста, не оставляйте ответы в комментариях. Это обходит процедуру контроля качества сайта, поскольку комментарии не могут быть отклонены, а также может отбить у других желание отвечать, что приводит к тому, что вопрос остается без ответа. Также обратите внимание, что ваш подход потерпит неудачу, если какой-либо из путей содержит символы новой строки.
 – 
terdon
7 Ноя 2021 в 21:19
1
@terdon, я только что проверил, и да, он улавливает новые строки в именах файлов и каталогов, поскольку они хранятся, например, как -rw-r--r-- b/users 0 2021-11-07 19:00 rr/hh\nll, и именно так они отображаются. Спасибо за вопрос...
 – 
Bib
7 Ноя 2021 в 22:03
3
Видите, вот почему нам нужны ответы: вы совершенно правы в том, что GNU tar, кажется, делает это (хорошо!), но это не относится к другим разновидностям tar (я только что проверил с помощью busybox tar например), и ответ может объяснить это и показать ограничения.
 – 
terdon
7 Ноя 2021 в 22:05
3
Я всегда мог свернуть свой собственный tar и заставить его преобразовывать новые строки в изображения цыплят.
 – 
Bib
7 Ноя 2021 в 22:06

3 ответа

С star (из schily-tools):

star tzf file.tgz -find ! -type d
5
Stéphane Chazelas 8 Ноя 2021 в 15:18

Используйте awk. Очень хорошо объяснено в этом ответе: только файлы списка tar

tar tzf your_archive | awk -F/ '$NF !=""'

Обратите внимание, что это предполагает, что ваша реализация tar печатает литерал \n, если пути содержат символы новой строки. GNU tar и bsdtar делают это, а busybox tar и, предположительно, другие - нет.

5
αғsнιη 8 Ноя 2021 в 19:49
1
Обратите внимание, что это не удастся, если какой-либо из путей содержит символы новой строки.
 – 
terdon
7 Ноя 2021 в 21:20
1
Вы действительно проверяли этот тердон или просто делаете предположение?
 – 
Bib
7 Ноя 2021 в 22:05
1
Оба, на самом деле. Я предполагал (поэтому и не голосовал). Но ваш комментарий заставил меня проверить и увидеть, что GNU tar действительно печатает литерал \n, а другие нет, поэтому я просто снова отредактировал этот ответ.
 – 
terdon
7 Ноя 2021 в 22:07
Или даже ... |awk '/[^/]$/'
 – 
αғsнιη
8 Ноя 2021 в 19:53

Если вы используете GNU tar и ваш tar-файл невелик, вы можете использовать --to-command option для выполнения команды для каждого файла:

% tar c folder | tar x --to-command 'printf "%s\n" "$TAR_REALNAME"'            
folder/subdir1/file1.txt
folder/subdir1/file2.txt
folder/subdir2/file1.txt

В настоящее время эта опция отправляет команде только обычные файлы, но несложно защититься от каталогов, которые будут поддерживаться в будущем, с помощью переменной TAR_FILETYPE, заданной tar:

% tar c folder | tar x --to-command '[ "$TAR_FILETYPE" != d ] && printf "%s\n" "$TAR_REALNAME"'
folder/subdir1/file1.txt
folder/subdir1/file2.txt
folder/subdir2/file1.txt
4
Stéphane Chazelas 8 Ноя 2021 в 15:26