find
имеет много-много-много опций для включения, исключая пути, файлы, каталоги, обычно параметры фильтрации, как вы хотите.
В вашем случае я думаю, что это будет:
# exclude all folders named node_modules
# exclude the top level folder called workspace
# but no sub folders called workspace
find dir -type f \
-not -regex '.*/node_modules/.*' -a \
-not -regex 'dir/workspace/.*' \
-exec tar -czf ./output.tar.gz {} +
Вы можете предпочесть вместо -exec
например find ... -print0 | xargs -0 tar -czf ./output.tar.gz
. Я думаю, что лучше всего будет find ... -print0 | tar -czf ./output.tar.gz --null -T -
, так как он не потерпит неудачу, если будет слишком много файлов, ie. я думаю, слишком много аргументов для передачи tar
.
Я воссоздал каталог dir
с:
while read l; do
mkdir -p "$(dirname "$l")"
touch "$l"
done <<EOF
dir/workspace/1.txt
dir/node_modules/2.txt
dir/subfolder/workspace/3.txt
dir/subfolder/node_modules/4.txt
dir/subfolder/other_folder/5.txt
EOF
, затем протестирован на repl и tar -tf ./output.tar.gz
отпечатки:
dir/subfolder/workspace/3.txt
dir/subfolder/other_folder/5.txt