BASH:如何删除清单中指定的所有文件?

问题描述:

我有一个清单文件,它只是换行符分隔的文件名列表。如何从文件夹中删除名单中名为而非的所有文件?BASH:如何删除清单中指定的所有文件?

我试图动态生成一个find ./ ! -name "filename"命令:

command="find ./ ! -name \"MANIFEST\" " 
for line in `cat MANIFEST`; do 
    command=${command}"! -name \"${line}\" " 
done 
command=${command} -exec echo {} \; 
$command 

但文件仍保留。

[注意:]我知道这使用回声。我想在使用它之前检查我的命令的功能。

解决方案:(感谢PixelBeat

ls -1 > ALLFILES 
sort MANIFEST MANIFEST ALLFILES | uniq -u | xargs rm 

没有临时文件:

ls -1 | sort MANIFEST MANIFEST - | uniq -u | xargs rm 

两个忽略的文件是否排序/没有。

+0

谢谢大家!我将它提供给pixelbeat,以便他的外壳指南持有解决方案 – brice 2010-05-08 11:57:08

使用“差集”模式从http://www.pixelbeat.org/cmdline.html#sets

(find ./ -type f -printf "%P\n"; cat MANIFEST MANIFEST; echo MANIFEST) | 
    sort | uniq -u | xargs -r rm 

注意我列出清单两次的情况下,也有上市那里,实际并不存在的文件。 还要注意上述支持子目录中的文件

+0

我在命令中获得了'rm:missing operand'。我只是用ls,comm和xargs来判断它。无论如何pb – brice 2010-05-06 16:22:11

+0

添加-r到xargs以删除该警告(当没有文件需要删除时) – pixelbeat 2010-05-07 02:11:40

+1

使用'grep'设置差异模式: 'find ./ -type f -printf“%P \ n “| fgrep -vf MANIFEST | ...' – 2010-05-10 11:12:12

想通了:

ls -1 > ALLFILES 
comm -3 MANIFEST ALLFILES | xargs rm 
+2

是的comm-3与我上面的解决方案相同。但要小心,因为通信预期已经排序的输入 – pixelbeat 2010-05-06 16:27:20

+0

干杯,使用未分类的设置差异提高。 – brice 2010-05-06 16:40:10

+1

如果您的文件名包含空格,请使用'xargs -L 1'。 – djjeck 2014-05-06 21:23:04

假设该清单已经排序:

find -type f -printf %P\\n | sort | comm -3 MANIFEST - | xargs rm 

只是为了好玩,一个Perl 1衬...在这种情况下并不是真的需要,但是如果你想要更有趣的东西,可以比Bash定制/扩展更多:)

$ ls 
1 2 3 4 5 M 
$ cat M 
1 
3 
$ perl -e '{use File::Slurp; %M = map {chomp; $_ => 1} read_file("M"); $M{M}=1; \ 
foreach $f (glob("*")) {next if $M{$f}; unlink "$f"||die "Can not unlink: $!\n" };}' 
$ ls 
1 3 M 

如果你通过清单上STDIN

perl -e '{%M = map {chomp; $_ => 1} <>; $M{M}=1; \ 
foreach $f (glob("*")) {next if $M{$f};unlink "$f"||die "Can not unlink: $!\n" };}' M 

对于每个文件在当前目录清单文件grep的文件名和RM文件如果不匹配上面可以更短。

for file in * 
    do grep -q -F "$file" PATH_TO_YOUR_MANIFIST || rm "$file" 
done 
+1

如果您使用此方法,请确保将清单文件的名称添加到清单本身,以防将其放入与删除文件相同的目录中。如果您将此代码放入脚本中,则还要将该脚本的名称添加到清单中。 – 2013-11-11 16:38:39