Answers:
代替使用rm,使用find可能更容易。像这样的命令将删除除名为“ file”的文件以外的所有内容
find . \! -name 'file' -delete
的许多版本都应该能够支持全局和正则表达式匹配。
您也可以通过管道将find的输出传递给rm
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
,以及通过删除-delete
和将保存的文件\!
。
find
是递归的!因此所有不匹配“ pattern ”的文件子目录也将被删除
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
注意:运行命令,如果要删除的文件是正确的文件,请再次运行它并删除哈希字符“#”。
如果文件名更复杂,那就这样做
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
再次,首先查看结果,然后删除哈希符号。
如注释中所建议,此版本节省了一些字符,看起来也更加清晰。
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
,b
并a b
第一个程序会删除-如果你把AB到grep的部分:"^[ab]$"
a
和b
,但没有a b
,只是反对你的意图。第二个命令将执行相同的操作。第三也是。除了非常非常罕见的例外,您不应在脚本中使用“ ls”。只是不要这样做。
移动要保留的文件。上一层,删除文件夹。重新创建文件夹,然后将这些文件移回。
/
,对吗?不太实用。c)尝试删除您自己的所有文件$HOME
也不是切实可行的。
这就是我为OSX / MacOS注销钩子设置为.sh脚本的方式,效果很好。
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
使用GNU-find,您可以使用-delete开关,如果空的话,它也会删除目录:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
是解决此问题的一种方法。
tmp
,以及如果没有X
/ Y
/ Z
文件进去。注!
为GNU的标准当量-not
(-delete
也是GNU扩展)