求一段linux shell 的删除文件命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一段linux shell 的删除文件命令相关的知识,希望对你有一定的参考价值。

现有filenames.txt文件内容包含多个文件名如下
aaa
bbb
...
每个文件名为一行,需要删除 某个文件夹下的文件,只要文件名与filenames.txt内的文件名不匹配或不包含,则删除,匹配或包含则保留。
写了很久只能写出 列出某文件夹内包含filenames.txt内的文件名的文件。
求大神支招;

这个可以这样做,用awk将命令用sprintf组织好再通过system交给shell
cat filenames.txt|awk 'cmd=sprintf("if [ -e %s ];then rm %s;fi",$0,$0);system(cmd)'
额,这个是文件匹配的删除。

文件匹配的不删除,这个处于安全考虑你要加写限制条件,我试着写了个不管那么多的
#!/bin/bash
ls ./forrm/> linshi
cat filenames.txt | awk 'cmd=sprintf("sed -i 's/%s//' linshi",$0);system(cmd)'
x="`cat linshi`"
cd ./forrm
rm $x
cd ..
rm linshi
总之就是比如是针对./forrm文件夹下的文件,先把列出的文件存在个临时文件里(这里不考虑重名什么的),再通过你的filenames.txt把不删的都去掉。最后剩下的删掉,删掉临时文件
额,看着感觉有点蹩脚,不过可以实现

或者把要删的目录下的东西跟要匹配的文件里的东西分别放在两个数组里面,像这样
#!/bin/bash
if [ $# -ge 2 ];
then
directory=$1
filenames=$2
else
exit;
fi
arr1=("`ls $directory`")
arr2=("`cat $filenames`")

cur="`pwd`"
cd $directory
for i in $arr1
do
for j in $arr2
do
if [ "$j" = "$i" ];then
continue 2;
fi
done
rm $i
done

cd $cur
也可以
参考技术A #!/bin/bash
if [ $# -ge 2 ];
then
directory=$1
filenames=$2
fi
list=`ls $directory`
function demo()

file=$1
content=`cat $filenames`
for line in $content
do
if [ "$line" == "$file" ];
then
return
fi
done
rm $file

for filename in $list
do
cd $directory
if [ -f $filename ];
then
demo $filename
fi
done本回答被提问者采纳
参考技术B 这个很好解决, 就是shell编程的了!
如果想学习更多的shell程序, 就找下me了

linux shell下除了某个文件外的其他文件全部删除的命令

Linux反选删除文件

 

最简单的方法是

# shopt -s extglob      (打开extglob模式)
# rm -fr !(file1)
 

如果是多个要排除的,可以这样:

# rm -rf !(file1|file2) 
linux下除了某个文件外的其他文件全部删除的命令

Linuxrm删除指定文件外的其他文件方法汇总

一、Linux下删除文件和文件夹常用命令如下:  删除文件:  rm  file
删除文件夹:  rm  -rf  dir
需要注意的是,  rmdir  只能够删除  空文件夹。  二、删除制定文件(夹)之外的所有文件呢?
1、方法1,比较麻烦的做法是:
复制需要保留的文件到其他文件夹,然后将该目录删除,  然后将需要保留的移动  回来。  mv  keep  ../  #保留文件(夹)  keep
rm  -rf  *  #删除当前文件夹里的所有文件  mv  ../keep  ./  #将原来的东西移动回来
2、方法2,需要在当前文件夹中进行:
rm  -rf  !(keep)  #删除keep文件之外的所有文件
rm  -rf  !(keep1  |  keep2)  #删除keep1和keep2文件之外的所有文件
3、方法3,当前文件夹中结合使用grep和xargs来处理文件名:  ls  |  grep  -v  keep  |  xargs  rm  #删除keep文件之外的所有文件
说明:  ls先得到当前的所有文件和文件夹的名字,  grep  -v  keep,进行grep正则匹配查找keep,-v参数决定了结果为匹配之外的结果,也就是的到了keep之外的所有文件名,然后  xargs用于从  标准输入获得参数  并且传递给后面的命令,这里使用的命令是  rm,然后由rm删除前面选择的文件。
好处:使用了grep来正则表达式来匹配文件名字,可以一次保留多个文件,从而进行更加准确的处理。
4、方法4,使用find命令代替ls,改进方法3从而能够处理制定文件夹的文件:
find  ./test/  |  grep  -v  keep  |  xargs  rm  #删除当前test文件夹中keep文件之外的所有文件
说明,用grep而不用find  -name选取名字,因为find选取名字时比较麻烦,对正则表达式支持不够,无法排除指定文件名。
5、方法5,直接使用find命令删除其他文件:
find  ./  -name  \'[^k][^e][^e][^p]*\'    -exec  rm  -rf  {}  \\;  #删除keep以外的其他文件。  find  ./  -name  \'[^k][^e][^e][^p]*\'    |  xargs  rm  -rf    #删除keep以外的其他文件。推荐!
说明:上面第二行的代码效率高些,原因在于删除多个文件时  -exec会启动多个进程来处理,而xargs会启动一个rm进程来处理。
关于find  执行命令的效率和借用xargs启动的命令效率的比较,详情请参考:http://www.linuxsir.org/main/?q=node/137
Linux文件查找命令find,xargs详述    http://www.linuxsir.org/main/?q=node/137  本文转载自:http://blog.sina.com.cn/s/blog_70ffb5c501011rrk.html

rm删除除去指定文件的剩余所有文件  (rm 反向删除)

zhou@zhou:~/LinuxC/file/test$ ls
1  23sdfwe 88888888  aabb ag   ghdda    mmm
2 3       aaaaaaaa abc  asdg  llllllll wwwww
zhou@zhou:~/LinuxC/file/test$

然后我想删除除了包含字符串aa外所有的文件,也就是想留下aabb,aaaaaaaa,这两个文件, 其他 的全部删除
下面是我的命令:

zhou@zhou:~/LinuxC/file/test$ rm `ls | grep -v"aa"`
zhou@zhou:~/LinuxC/file/test$ ls
aaaaaaaa  aabb
zhou@zhou:~/LinuxC/file/test$
所以了,成功了。
简单的解释一下那条命令吧:rm 删除后面指定的文件
`ls | grep -v "aa" ` 记得外面是反引号(反引号的位置就在标准键盘的数字1的左边),
ls:查看当 前目录下所有的文件,使用grep命令过滤一下grep -v "aa" 就是找出字符串中不带“aa”的。

整体再顺一下:列出文件名不带“aa”串的文件,然后删除他们。OK。
其实说起来简单,当时我也做了好长时间,因为以前没怎么接触grep,因此一开始我想到的办法是使用正则表
达式,但是在做的过程中突然发现了grep使个不错的东西,因此就使用了。

上面的命令使删除带有“aa”串的文件,那如果我只想留下文件aa呢?很简单

zhou@zhou:~/LinuxC/file/test$rm `ls | grep -v"^aa$" `
在aa前面加上^,后面加上$表示结束符的意思,这个就是完全匹配了。
好了,就这么多。但愿以后能用到这个有用的命令
转自:http://blog.sina.com.cn/s/blog_67e34ceb01014930.html

linux 删除其他文件

http://zhidao.baidu.com/link?url=uvHfrb3kSnM_8p5ILhZyc39U0h3md-Ncrm3iaygeYTLU-zjthNBlqO674VulVGTnPiNcl2nj7wo5vn08N4481_

求教 linux centos我想删除某目录中文件名不符合"*20100330*"这样规则的文件应该怎么删除?

假设目录名为myTest且为当前目录的下一级目录,使用如下命令即可:
cd ./myTest && rm `ls | grep -v \'20100330\'` && cd ..

进入myTest目录,删除文件后返回当前目录。

grep的-v参数表示反向选择。

一般使用rm删除文件的时候会有确认提示,如果不要确认,直接强制删除,可以使用rm的-f参数。

其他1条回答

find ./ -type f \\! -name "*20100330*" -exec rm -rf {} \\;

如何反向选择文件并删除

http://bbs.csdn.net/topics/390077765

案例:一个文件夹下我想删除 除了abc文件 之外的所有文件,命令怎么写(linux下)

find . -maxdepth 1 -type f -not -name \'abc\' -exec rm \'{}\' \';\'

ls | grep -v abc | xargs -i rm -rf {}

rm -f `ls | grep -v abc`
如果文件很多的情况下,不要用这种方法……
要用2楼的方法……

mv abc /tmp
rm *
mv /tmp/abc .

 

反向显示文件

 

使用ls命令仅仅显示当前目录不包括.的文件.

ls加grep过滤的方式:ls -al | grep -v \'\\.\'(ls --ignore=.* -al也可实现)。

在打开extglob模式下(缺省是打开的),ls也可以实现,而且更加灵活.

shopt -u extglob #关闭
shopt -s extglob #打开

ls -al !(*.*)
ls -al -d !(*.*)

以上是关于求一段linux shell 的删除文件命令的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 删除文件夹命令

如何将Linux rm命令删除的文件放入垃圾箱

如何在linux下筛选一段时间的内的文件

shell 中的find命令时间参考点?

Linux命令笔记

如何删除linux curl 命令行