В настоящее время у меня есть этот скрипт:
find . -iname '*.log' -print0 | xargs -0 tar zcf $file
Для сбора всех файлов "* .log" из данного каталога. Я хотел бы изменить его, чтобы включить также все файлы ".txt", но я не знаю как, это должно быть довольно просто, верно?
Вы на правильном пути. Попробуйте это:
find . \( -iname "*.log" -or -iname "*.txt" \) -print0 | xargs -0 tar zcf $file
Это почти совпадает с ответом Рафаэля Б., но он также обрабатывает превышение максимальной длины аргумента. Мы делаем это, просто приказывая tar прочитать имена файлов для архивирования из stdin (где нет ограничений) вместо того, чтобы ожидать их в качестве аргументов:
find . \( -iname "*.log" -o -iname "*.txt" \) -print0 | tar --null --files-from=- -zcf "$file"
Обратите внимание, что это специфично для GNU. tar в других системах UNIX или UNIX-подобных не понимает --null
, но tar в Ubuntu - это GNU tar, поэтому там он будет работать нормально.
Как насчет этого очень простого подхода:
find -iname '*.txt'; find -iname '*.log'
Вот ответ на бесполезное использование xargs:
find \( -name "*.log" -or -name "*.txt" \) -exec tar zcf archiv2 {} +
Я не проверял это для большого количества файлов - был бы рад комментарию и числу, где это терпит неудачу.
Псевдоаргумент, который вы должны помнить, чтобы поместить -delete в качестве последнего: Ну, да, вы тоже должны помнить, чтобы поставить | xargs ... как последний, не так ли?
find . -regextype posix-extended -iregex '.*\.(log|txt)' -print0 | xargs -0 tar zcf $file
Вы можете заменить '.*\.(log|txt)'
любым регулярным выражением POSIX Extended .
Пример соответствует:
Любое число любого символа
, затем «.»
, затем «log» или «txt»
< / BLOCKQUOTE>