2010-05-06 91 views
17

我有一個清單文件,它只是換行符分隔的文件名列表。如何從文件夾中刪除名單中名爲而非的所有文件?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

回答

11

使用「差集」模式從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

3

想通了:

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

0

假設該清單已經排序:

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

只是爲了好玩,一個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 
13

對於每個文件在當前目錄清單文件grep的文件名和RM文件如果不匹配上面可以更短。

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

如果您使用此方法,請確保將清單文件的名稱添加到清單本身,以防將其放入與刪除文件相同的目錄中。如果您將此代碼放入腳本中,則還要將該腳本的名稱添加到清單中。 – 2013-11-11 16:38:39

相關問題