如何删除目录及其子目录中所有不以 -out 结尾的文件?例如删除foo.bar
但不删除foo-out.bar
。
编辑:
我努力了
for a_file in $(find . ! -name '*-out*'); do rm $a_file; done;
但是这个脚本不包含空格。我该如何解决这个问题?
答案1
如何使用find
命令的内置-delete
操作?这应该是空格安全的
find . ! -name '*-out*' -type f -delete
否则,你可以做一个以空字符结尾的 while 循环 - 确保你也引用了 filename 变量
while read -rd $'\0' f; do rm "$f"; done < <(find . ! -name '*-out*' -type f -print0)
答案2
除了答案之外。
您不必使用 for 循环。find
提供-exec
和-delete
。
快速测试
cd `mktemp -d`
touch {1..9}\ -out{a..c}
$ find . -name '*-out*'
./2 -outb
./8 -outb
./9 -outa
./4 -outc
./6 -outb
./5 -outc
./7 -outb
./9 -outb
./2 -outa
./4 -outa
./8 -outc
./8 -outa
./7 -outc
./3 -outb
./6 -outa
./3 -outa
./1 -outb
./9 -outc
./1 -outa
./5 -outa
./4 -outb
./3 -outc
./1 -outc
./5 -outb
./2 -outc
./7 -outa
./6 -outc
它适用于空格。
你需要的是:
find . ! -name '*-out*' -exec rm -f {} \;
更安全的替代方案:find . -name '*-out*' -exec rm -i {} \;
笔记:使用-exec rm -i {} \;
确认删除。