[英]Linux - Change permissions of all files & directories except 1 directory?
[英]Using find - Deleting all files/directories (in Linux ) except any one
如果我们要删除我们使用的所有文件和目录, rm -rf *
。
但是如果我想要删除所有文件和目录,除了一个特定的文件,该怎么办?
那有什么命令吗? rm -rf *
一次性易于删除,但删除了我喜欢的文件/目录。
提前致谢
find
可以成为一个非常好的朋友:
$ ls
a/ b/ c/
$ find * -maxdepth 0 -name 'b' -prune -o -exec rm -rf '{}' ';'
$ ls
b/
$
说明:
find * -maxdepth 0
:选择一切由选择*
没有下降到任何目录
-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
细节 :
上述命令的思考过程是:
例
创建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
至少在zsh中
rm -rf ^filename
如果您只想保留一个文件,可以选择一个选项。
您可以在命令行中键入它,也可以在脚本中使用此键击
files=`ls -l | grep -v "my_favorite_dir"`; for file in $files; do rm -rvf $file; done
PS我建议-i
切换rm
以防止重要数据的删除。
PPS您可以根据此解决方案编写小脚本并将其放在/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;
在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/
如果它只是一个文件,一种简单的方法是将该文件移动到/tmp
或其他东西, rm -Rf
目录然后将其移回。 您可以将其命名为简单命令。
另一种选择是做一个find
,然后grep
出来你不想要的东西(使用-v
或直接使用的一个find
小号谓语),然后rm
荷兰国际集团剩余的文件。
对于单个文件,我会做前者。 除此之外,我还会写一些类似于thkala所说的定制。
我看到很多longwinded的意思,这个工作,但有一个/ 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 *
,其结果取决于您当前的目录(可能是/
;-) *
:它的扩展受到ARGV_MAX的限制。 cd ..
ln trash/useful.file ./
rm -rf trash/*
mv useful.file trash/
我不知道这样的程序,但我过去曾经想过它一段时间。 基本语法是:
IFS='
' for f in $(except "*.c" "*.h" -- *); do
printf '%s\n' "$f"
done
我想到的程序有三种模式:
-e
) glob
匹配(默认,如上例所示) -r
) 它需要从命令行中排除模式,然后是分隔符--
,后跟文件名。 或者,可以从stdin
读取文件名(如果给出选项-s
),每个都在一行上。
使用C语言或Shell命令语言编写这样的程序应该不难。 它是学习Unix基础知识的一个很好的练习。 当你将它作为shell程序执行时,你必须注意包含空格和其他特殊字符的文件名。
你需要使用正则表达式。 编写一个正则表达式,选择除所需文件之外的所有其他文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.