最近我面临着删除目录中所有文件/文件夹的任务,不包括那些匹配特定模式的文件/文件夹。所以我编写了一个单行 unix 命令来完成这项工作。必须只有一行吗?我想不是,但那样肯定更酷!
虽然问题很简单,但我对我的解决方案最终变得如此复杂感到有些惊讶。这是我使用的命令;注意:这是一个糟糕的解决方案,因为它不处理包含换行符的文件名(这在我的情况下无关紧要)。
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Run Code Online (Sandbox Code Playgroud)
我没有使用“find”命令,因为我不想递归到匹配 PATTERN 的文件夹中。例如,考虑以下文件结构:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
Run Code Online (Sandbox Code Playgroud)
使用模式“foo”必须只删除“first_dir”(当然也是它的内容)和“somefile.txt”(不是“anotherfile.txt”或“morefiles.log”)。
问题,是否有更好(更优雅和正确)的方法来实现这一目标?
编辑:
最近我注意到“查找”可能是一个更好的选择:
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Run Code Online (Sandbox Code Playgroud)
此解决方案可以正确处理包含换行符的路径。