Позначайте всі PDF-файли в каталозі, зберігаючи структуру каталогу


11

Я намагаюся створити стислий тарбол, який містить усі файли PDF, які існують в одному з моїх каталогів. Слід зберегти структуру каталогів. Порожні каталоги не потрібні, але мені дуже байдуже, чи вони там є.

Наприклад, скажіть, у мене був каталог, який виглядав так:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

Після запуску команди я хотів би dir.tar.gzмістити таке:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

Можливо?

Відповіді:


10

Тут буде вказано всі PDF-файли:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

Ви можете передати цю програму, xargsщоб отримати її як єдину лінію, обмежену пробілом, і подати її tarдля створення архіву:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(Цим чином вимкнено порожні каталоги)


1
Це так приголомшливо, дякую за допомогу. Ось що я придумав:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
Метт Олександр

3
@mattalexx: Остерігайтеся, що ця команда не буде працювати, якщо будь-яке з назв файлів містить пробіли або \'"(помилка xargs), і не працюватиме, якщо занадто багато імен файлів (помилка ядра).
Жил "ТАК - перестань бути злим"

2
@Gilles Що стосується назви файлів з пробілами та одинарними цитатами, -printf '"%p"\n'частина дбає про це (принаймні, це зробило для мене).
Метт Олександр

1
@Gilles Цікаво про обмеження ядра. Скільки аргументів ви можете мати в команді в Linux?
Метт Олександр

5
О, на "не буде працювати", зауважте, що тут режим відмови полягає в тому, що якщо командний рядок занадто довгий, xargs розділить його, так що останній виклик tar буде мовчки перезаписувати файли, написані попередніми викликами .
Жиль "ТАК - перестань бути злим"

6

З bash ≥4 або zsh та GNU tar:

tar -czf dir.tar.gz dir/**/*.pdf

Це може не спрацювати, якщо у вас дуже велика кількість файлів PDF і командний рядок занадто довгий. Тоді вам знадобиться більш складне рішення, засноване на пошуку (знову ж таки, за допомогою дьогтю GNU):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

Альтернативно (і портативно) ви можете створити архів за допомогою pax .

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

Перший -sговорить, що потрібно включати всі .pdfфайли, не змінюючи їх імені. Другий -sговорить про перейменування всіх інших файлів на порожнє ім’я, що насправді означає не включати їх до архіву.


О так, я мав на увазі згадати zsh's **; Я навіть не усвідомлював, що баш 4 мав це зараз
Майкл Мрозек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.