我想压缩一个看起来像这样的目录:
dir
└── workspace
└── node_modules
└── subfolder
└── workspace
└── node_modules
└── other_folder
我想排除名为node_modules
的 all 个文件夹,并排除名为workspace
的顶级文件夹,但不包括名为workspace
的子文件夹。
所以我要结束的是这个:
dir
└── subfolder
└── workspace
└── other_folder
我正在运行以下命令:tar -czf ./output.tar.gz --exclude=node_modules --exclude=./workspace dir/.
但是它要删除名为工作区和 node_modules的所有文件夹,所以我最终得到了这个:
dir
└── subfolder
└── other_folder
如何仅删除所需的特定工作区文件夹,而不是所有具有相同名称的文件夹?
答案 0 :(得分:1)
json
有很多很多选项,包括但不包括路径,文件,目录,以及通常要过滤的选项。
对于您的情况,我认为应该是:
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 -
的参数太多。
我使用以下命令重新创建了tar
目录:
dir
然后tested on repl和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
打印:
tar -tf ./output.tar.gz
答案 1 :(得分:0)
在必要的情况下,可以使用tar排除:
--exclude dir/./folder
-直接应用于dir下的文件夹--exclude folder
-将排除树中任何位置的文件夹应该可以使用:
tar -czf ./output.tar.gz --exclude=node_modules --exclude=dir/./workspace dir/.
当然可以使用--files-from
,并使用其他工具来生成列表。与使用xargs
相比,列表可能包含大量文件时,通常是首选方法。
find dir/. -type f ... | tar cvz ./output.tar.gz -T-