我需要实际示例如何删除不在 Linux 列表中的文件夹。所以我不需要比较它的内容或 md5sums,只需比较文件夹名称。
例如,一个文件夹里面有几个文件夹
target_folder/
??? folder1
??? folder2
??? folder3
??? folder4
Run Code Online (Sandbox Code Playgroud)
我的文件夹名称列表是 txt 文件,包括文件夹 1、文件夹 2 而不是文件夹 3 和文件夹 4。
如何通过bash脚本删除folder3和folder4?
这已在 serverfault 上回答为
GLOBIGNORE=folder1:folder2
rm -r *
uset GLOBIGNORE
Run Code Online (Sandbox Code Playgroud)
但我真正的任务是删除一堆文件夹。txt 列表包含大约 100 个文件夹,要清理的目标文件夹是 200 个文件夹。
请注意,这应该适用于 Linux 和 FreeBSD。
编辑: target_folder 可能包含带有子文件夹和文件的文件夹。没有空格和前导点和名称不相似:foo.com bar.org emptydir file.txt simplefile。但除列表中的名称外,所有这些项目都应删除。
第一个答案更明显和简单。第二个更高级和灵活,它也允许您根据项目类型进行删除。
假设您的文件名不包含任何:\[*?
,您仍然可以使用GLOBIGNORE
. 只需相应地格式化您的目录列表。例如:
$ cat names.txt
folder1
folder3
Run Code Online (Sandbox Code Playgroud)
这很容易转换为冒号分隔的列表:
$ paste -s -d : names.txt
folder1:folder3
Run Code Online (Sandbox Code Playgroud)
因此,您现在可以将其设置为 GLOBIGNORE 的值:
GLOBIGNORE=$(paste -s -d : ../names.txt)
Run Code Online (Sandbox Code Playgroud)
并继续正常删除它们:
rm -r -- *
Run Code Online (Sandbox Code Playgroud)
我刚刚在具有 300 个目录的 Linux 上测试了它,它运行良好。
这个怎么样?
find ./target_folder/ \
-mindepth 1 \
-maxdepth 1 \
-type d \
-not -name 'anything[0-9]*' \
-exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
让我解释:
-mindepth 1
确保你不匹配./target_folder/
-maxdepth 1
确保您不匹配任何子文件夹。-type d
告诉 find 仅匹配目录,而不匹配文件。-not -name 'anything[0-9]*'
从模式中排除任何与该模式匹配的内容。很明显,那个。-exec
是要小心使用,特别是当涉及到时rm
。在继续以这种方式进行操作之前,您应该始终使用它进行测试。可能很棘手echo
rm -rf
find
\;
。您可以阅读find
手册页以获取更多信息。这是一个非常方便的工具。