使用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
当前回答
您可以使用两个命令序列来完成此操作。 首先定义一个数组,其中包含你不想排除的文件的名称:
files=( backup.tar.gz script.php database.sql info.txt )
在此之后,循环遍历你想要排除的目录中的所有文件,检查文件名是否在你不想排除的数组中;如果不是,然后删除文件。
for file in *; do
if [[ ! " ${files[@]} " ~= "$file" ]];then
rm "$file"
fi
done
其他回答
由于还没有人提到这一点,在一个特定的案例中:
OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES
(或者只是rm $OLD_FILES)
or
OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES
你可能需要使用shop -s nullglob,如果一些文件可能在那里或不在那里:
SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB
如果没有nullglob,则echo *.sh *。Bash可能会给你“a.sh b.sh *. Bash”。
(说了这么多,我自己更喜欢这个答案,即使它在OSX中不起作用)
使文件不可变。即使root用户也不允许删除它们。
chattr +i textfile.txt backup.tar.gz script.php database.sql info.txt
rm *
所有其他文件都已删除。 最终你可以将它们重置为可变的。
chattr -i *
如果你正在使用zsh,我强烈推荐。
rm -rf ^file/folder pattern to avoid
与extended_glob
setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)
你可以为它写一个for循环…%)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
这类似于@siwei-shen的评论,但是您需要-o标志来处理多个模式。-o标志代表'or'
找到。-o -not -name '*ignore2' | xargs rm . type f -not -name '*ignore1' -o -not -name '*ignore2