在tar命令中仅排除特定的文件夹

时间:2020-01-09 16:44:50

标签: shell tar archive

我想压缩一个看起来像这样的目录:

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

如何仅删除所需的特定工作区文件夹,而不是所有具有相同名称的文件夹?

2 个答案:

答案 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 replwhile 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-