Во-первых, использование find ... | xargs tar -c
не рекомендуется: если find
генерирует список файлов настолько долго, что xargs
разделяется на несколько tar
вызовов, все, кроме последнего, будут перезаписаны.
Намного безопаснее запустить только одну копию tar
и настроить , чтобы читать со стандартного ввода:
find . '(' -iname '*.txt' -o -iname '*.pdf' ')' -print0 |
tar -c --null -T - -zf backups.tar.gz
Написание оболочки, эквивалентной find
логика, оригинальная / ошибочная версия может выглядеть следующим образом:
for f in *; do
{ [[ $f = *.txt ]]; } || \
{ [[ $f = *.pdf ]] && printf '%s\0' "$f"; }
done
На самом деле ничего нет сделано , если ветвь *.txt
истинна, потому что printf
зависит только от*.pdf
case.
Либо используйте скобки, чтобы сгруппировать ваши ветви:
find . '(' -iname '*.txt' -o -iname '*.pdf' ')' -print0
... что делает логику похожей на:
for f in *; do
{ [[ $f = *.txt ]] || [[ $f = *.pdf ]]; } && printf '%s\0' "$f";
done
Или поместите отдельную копию действия с каждой стороны:
find . -iname '*.txt' -print0 -o -iname '*.pdf' -print0
..., которая действует как:
for f in *; do
{ [[ $f = *.txt ]] && printf '%s\0' "$f"; } || \
{ [[ $f = *.pdf ]] && printf '%s\0' "$f"; }
done