Як визначити тип файлів у всіх підкаталогах?


86

Я хочу зробити tar та всі файли .php та .html у каталозі та його підкаталогах. Якщо я використовую

tar -cf my_archive *

він роздирає всі файли, що я не хочу. Якщо я використовую

tar -cf my_archive *.php *.html

він ігнорує підкаталоги. Як я можу зробити його tar рекурсивно, але включати лише два типи файлів?

Відповіді:


146

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -


@DeeDee Чи є обмеження щодо кількості файлів тощо?
user1566515

1
@DeeDee - ні, я мав на увазі те, що вам не потрібні панелі!
Mike Makuch

@ user1566515 Може існувати певне обмеження файлової системи або загальний простір, яке може встановити верхнє обмеження для вашого файлу tar. Це повністю залежить від вашої власної системи. В іншому випадку трубопроводи по суті створять файл tar на льоту, тому ви не будете обмежені номером або розміром файлу.
DeeDee

Дякую! ... як додати більше 2 умов / виду файлу?
gluuke

5
Використання @gluuke -o -name [pattern]для кожної нової умови
DeeDee

15

Якщо ви використовуєте bashверсію> 4.0, ви можете скористатися shopt -s globstarцією короткою роботою:

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

це додасть усі файли .yml, які починаються з Аліси з будь-якого підкаталогу, а також додає всі файли .json, які починаються з Боба, з будь-якого підкаталогу.


2
Єдина відповідь, яка просто використовує смолу, найкраща відповідь IMO.
simon

2
Незважаючи на враження глобуса '**' для каталогу, ця команда не виконується рекурсивно (будь-які під-підпапки)
Едді

@Eddie ** повинен працювати. можливо, є щось інше з вашими параметрами. Також перевірте, чи немає місця в назві папки, яке ви вводите в командному рядку. Якщо ні, чи можете ви вставити свою фактичну команду?
Sairam Krish

'**' обчислюється оболонкою до досягнення команди, і вона розглядається лише як 2 незалежних *, які роздільні до 0 або символів, вона не має рекурсивної функціональності для охоплення
Едді

2
@eddie так, це оцінюється оболонкою, хоча bash> 4.0 має shopt -s globstarопцію, тому відповідь правильна і насправді найкраща
Роман Ушеренко

13

Один із методів:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

Однак є кілька застережень щодо цього методу:

  1. Це не вдасться, якщо в них є файли або каталоги з пробілами, і
  2. він не вдасться, якщо файлів стільки, що заповнена максимальна довжина командного рядка.

Рішенням для цього може бути виведення вмісту команди find у файл, а потім використання опції "-T, --files-from FILE" для tar.


1) Під "невдалою" ви маєте на увазі, що файли з пробілами будуть пропущені або архів tar не буде створений? 2) У мене близько 100 тис. Файлів. Це більше максимальної довжини командного рядка?
user1566515

1
1. Він створить архів, але повідомить про відсутні файли. 2. Це, здається, буде занадто довгим. З огляду на це, вам було б краще використовувати метод, як @DeeDee, запропонований нижче, він цілком обійде ці проблеми.
Робін Шит,


0

Покладіть їх у файл

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

Потім використовуйте файл як вхід для tar, використовуйте -I або -T залежно від версії tar, яку ви використовуєте

Скопіюйте символічні посилання за допомогою h

tar cfh my.tar -I files.txt 

0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

для багатоядерних або просто для одного ядра:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

Використовуйте "find" та "grep", щоб отримати весь шлях до .php та .html файлів у всій директорії та її підкаталогах. Потім передайте цю інформацію про шлях до tar для стиснення.

Будьте обережні з цими символами `і '. Зауважте також, що це досягне межі кількості символів, яку ваша оболонка дозволить у командному рядку, на відміну від деяких інших відповідей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.