使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
使用sudo rm -r时,如何删除除以下文件外的所有文件?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
当前回答
这类似于@siwei-shen的评论,但是您需要-o标志来处理多个模式。-o标志代表'or'
找到。-o -not -name '*ignore2' | xargs rm . type f -not -name '*ignore1' -o -not -name '*ignore2
其他回答
你可以为它写一个for循环…%)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
如果你正在使用zsh,我强烈推荐。
rm -rf ^file/folder pattern to avoid
与extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
extglob(扩展模式匹配)需要在BASH中启用(如果它没有启用):
shopt -s extglob
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
如果不指定-type f find也会列出目录,这可能不是您想要的。
或者一个更通用的解决方案,使用非常有用的组合find | xargs:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
例如,删除当前目录下的所有非txt文件:
find . -type f -not -name '*txt' -print0 | xargs -0 rm --
如果需要删除的文件名中有空格,则需要print0和-0组合。
这次行动有点晚了,但希望对那些晚到的人有用……
我发现@awi的答案和jamie Bullock对-delete的评论非常有用。一个简单的实用工具,这样你可以在不同的目录中忽略不同的文件名/类型,每次输入最少:
Rm_except(或任何你想命名的名称)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
例如,删除除文本文件和foo.bar之外的所有文件:
rm_except *.txt foo.bar
类似于@mishunika,但是没有if子句。