Chinaunix

标题: 删除指定文件之外的所有文件? [打印本页]

作者: jiangshachina    时间: 2007-08-08 17:52
标题: 删除指定文件之外的所有文件?
一个目录中有1000个文件,在这些文件中指定了200个文件。
希望删除这200个文件之外其它的800个文件。
请问,应该如何才能实现?
作者: mxbao    时间: 2007-08-08 17:59
如何区分要删出的和不删的呢?用什么方法?
作者: jiangshachina    时间: 2007-08-08 18:01
> 如何区分要删出的和不删的呢?用什么方法?
我有这些需要保留的200个文件的文件名。
作者: doking2008    时间: 2007-08-08 18:06
晕,这个问题也要问,有用的靠出来,不就行了。
如果你的200文件(各种特征,如:创建时间,名字特色,大小,类型等等)没有区别于另外800个文件特征,就只能一个一个拷贝。
作者: jiangshachina    时间: 2007-08-08 18:14
哈哈,是的,可以用mv,先移动到另一个目录中,再删除原目录中的800个文件。
其实我心里想的是,rm会不会ignore指定的文件
作者: maluyao    时间: 2007-08-08 20:36
我的笨办法,假设不删除的文件名都在filename.txt 里

  1. for i in `cat filename.txt`
  2. do
  3. chattr +i $i
  4. done
  5. rm -rf *
  6. for i in `cat filename.txt`
  7. do
  8. chattr -i $i
  9. done
复制代码


效率很低,但比没有强。
作者: jinl    时间: 2007-08-08 22:18
原帖由 maluyao 于 2007-8-8 20:36 发表
我的笨办法,假设不删除的文件名都在filename.txt 里

for i in `cat filename.txt`
do
chattr +i $i
done
rm -rf *
for i in `cat filename.txt`
do
chattr -i $i
done


效率很低,但比没有强。


要提高效率,可以把第一个for循环里的命令改成mv $i ./tmp
这样第二个循环就可以省掉了
作者: jiangshachina    时间: 2007-08-09 07:45
非常感谢!
作者: maluyao    时间: 2007-08-09 08:14
使用move,如果/tmp和当前位置不在同一个分区的话,效率可能更差。

原帖由 jinl 于 2007-8-8 22:18 发表


要提高效率,可以把第一个for循环里的命令改成mv $i ./tmp
这样第二个循环就可以省掉了

作者: 寂寞烈火    时间: 2007-08-09 09:20
原帖由 jiangshachina 于 2007-8-8 17:52 发表
一个目录中有1000个文件,在这些文件中指定了200个文件。
希望删除这200个文件之外其它的800个文件。
请问,应该如何才能实现?

cat filelist|xargs rm
作者: aitilang    时间: 2007-08-09 13:37
先ls得到所有的文件名,然后 grep -v 去掉需要保留的文件,再rm
。。。。
我是不是天才??
作者: qzxym    时间: 2007-08-09 19:20
chattr +i 需要保留的文件名
rm -f *

我不是更天才?

[ 本帖最后由 qzxym 于 2007-8-9 19:26 编辑 ]
作者: maluyao    时间: 2007-08-09 20:01
从算法的复杂度来说,你这个方法是n的平方。

绝对不是天才。

原帖由 aitilang 于 2007-8-9 13:37 发表
先ls得到所有的文件名,然后 grep -v 去掉需要保留的文件,再rm
。。。。
我是不是天才??

作者: maluyao    时间: 2007-08-09 20:03
参考10楼的方法

  1. cat filelist|xargs chattr +i
  2. rm -rf *
  3. cat filelist|xargs chattr -i
复制代码


这大概是最佳方案吧。
作者: 零二年的夏天    时间: 2007-08-09 20:10
原帖由 maluyao 于 2007-8-9 20:03 发表
参考10楼的方法

cat filelist|xargs chattr +i
rm -rf *
cat filelist|xargs chattr -i


这大概是最佳方案吧。


也不一定。如果工作的文件系统不支持chattr这就不工作了。

我倒是觉得 烈火 兄的方案最好。
不过,显然他并没有直接给出答案。
问题是,得到要删除的文件列表是比较容易的。
作者: 一梦如是    时间: 2007-08-10 08:22
  1. shopt -s extglob
  2. rm !(*.txt)
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2