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
两个忽略的文件是否排序/没有。
答
使用“差集”模式从http://www.pixelbeat.org/cmdline.html#sets
(find ./ -type f -printf "%P\n"; cat MANIFEST MANIFEST; echo MANIFEST) |
sort | uniq -u | xargs -r rm
注意我列出清单两次的情况下,也有上市那里,实际并不存在的文件。 还要注意上述支持子目录中的文件
答
假设该清单已经排序:
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
谢谢大家!我将它提供给pixelbeat,以便他的外壳指南持有解决方案 – brice 2010-05-08 11:57:08