如何解决使用查找-删除所有文件/目录在Linux中,除了任何一个
|| 如果要删除我们使用的所有文件和目录,rm -rf *
。
但是,如果我想一次删除所有文件和目录,除了一个特定文件,该怎么办?
有什么命令吗? rm -rf *
可让您轻松删除照片,甚至删除我喜欢的文件/目录。
提前致谢
解决方法
find
可以是一个很好的朋友:
$ ls
a/ b/ c/
$ find * -maxdepth 0 -name \'b\' -prune -o -exec rm -rf \'{}\' \';\'
$ ls
b/
$
说明:
find * -maxdepth 0
:选择ѭ5selected选择的所有内容,而无需进入任何目录
-name \'b\' -prune
:请勿打扰(-prune
)任何符合条件-name \'b\'
的东西
-o -exec rm -rf \'{}\' \';\'
:打rm -rf
顺便说一句,另一种可能更简单的方法是移动或重命名您喜欢的目录,这样就不会妨碍您:
$ ls
a/ b/ c/
$ mv b .b
$ ls
a/ c/
$ rm -rf *
$ mv .b b
$ ls
b/
,简短答案
ls | grep -v \"z.txt\" | xargs rm
细节:
上述命令的思考过程为:
列出所有文件(ls)
忽略一个名为\“ z.txt \”的文件(grep -v \“ z.txt \”)
删除列出的文件,而不是z.txt(xargs rm)
例
创建5个文件,如下所示:
echo \"a.txt b.txt c.txt d.txt z.txt\" | xargs touch
列出除z.txt之外的所有文件
ls|grep -v \"z.txt\"
a.txt
b.txt
c.txt
d.txt
现在,我们可以使用xargs实用工具删除(rm)列出的文件:
ls|grep -v \"z.txt\"|xargs rm
,您可以在命令行中直接输入,也可以在脚本中使用此按键
files=`ls -l | grep -v \"my_favorite_dir\"`; for file in $files; do rm -rvf $file; done
附言我建议将-i
切换为rm
,以防止重要数据分配。
P.P.S您可以根据此解决方案编写小脚本并将其放置在/usr/bin
(例如/usr/bin/rmf
)上。现在,您可以将其用作普通应用程序:
rmf my_favorite_dir
脚本看起来像(只是草图):
#!/bin/sh
if [[ -z $1 ]]; then
files=`ls -l`
else
files=`ls -l | grep -v $1`
fi;
for file in $files; do
rm -rvi $file
done;
,至少在zsh中
rm -rf ^filename
如果您只想保留一个文件,则可以选择。
,如果它只是一个文件,一种简单的方法是将该文件移动到/tmp
或其他位置,rm -Rf
目录,然后再将其移回。您可以将此别名作为一个简单的命令。
另一种选择是先执行find
,然后再进行grep
(不需要的话)(使用-v
或直接使用find
的谓词之一),然后再进行rm
处理其余文件。
对于单个文件,我会做一个。我还要写一些类似于thkala所说的习惯。
,在bash中,您具有!()
glob运算符,该运算符会反转匹配的模式。因此,要删除文件my_file_name.txt
以外的所有内容,请尝试以下操作:
shopt -s extglob
rm -f !(my_file_name.txt)
请参阅本文以获取更多详细信息:
http://karper.wordpress.com/2010/11/17/deleting-all-files-in-a-directory-with-exceptions/
,我不知道这样的程序,但是过去我一直想要它。基本语法为:
IFS=\'
\' for f in $(except \"*.c\" \"*.h\" -- *); do
printf \'%s\\n\' \"$f\"
done
我想到的程序具有三种模式:
完全匹配(带有-e
选项)
glob
匹配(默认值,如上例所示)
正则表达式匹配(带有选项-r
)
它采用从命令行中排除的模式,后跟分隔符--
,然后是文件名。或者,可以从from39ѭ(如果提供了选项-s
)中读取文件名,每行一行。
用C或Shell命令语言编写这样的程序应该不难。它对于学习Unix基础知识是一个很好的练习。当您将其作为Shell程序执行时,当然必须注意包含空格和其他特殊字符的文件名。
,我在这里看到了很多of花一现的手段,但确实有
a / b / c / d / e /
rm -rf *.* !(b*)
这将删除目录b /及其内容以外的所有内容(假设您的文件位于b /中。
然后只是cd b /
rm -rf *.* !(filename)
删除所有其他内容,但要保留的文件(名为\“ filename \”)。
,mv subdir/preciousfile ./
rm -rf subdir
mkdir subdir
mv preciousfile subdir/
这看起来很乏味,但相当安全
避免复杂的逻辑
永远不要使用rm -rf *
,它的结果取决于您当前的目录(可能是/
;-)
切勿使用通配符“ 5”:其扩展受到ARGV_MAX的限制。
使您可以在每个命令之后检查错误,并可以避免由下一个命令引起的灾难。
避免由文件名中的空格或NL引起的讨厌问题。
,cd ..
ln trash/useful.file ./
rm -rf trash/*
mv useful.file trash/
,您需要为此使用正则表达式。编写一个正则表达式,选择除所需文件之外的所有其他文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。