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