2009-05-21 7 views
0

私は、現在のディレクトリでは削除しないでください "list_files"ファイルに隠しファイルのリストを持っています。どのようにFindコマンドを使用してそれらを除くすべてを削除できますか?私が試したが、それは明らかに動作しません:Findコマンドを使用してリストされたファイル以外のすべてを削除するにはどうすればよいですか?

find . -iname ".*" \! -iname 'list_files' 

答えて

1

となります。ファイルの削除は、常に安全に行う必要があります。

私は隠しファイルのディレクトリツリーと、保持したい隠しファイルのサブセットリストがあるとします。他のすべての隠しファイルを削除します。

隠しファイルのリストから始めましょう。

ここで、リストをすべてのファイル(list_filesの作成)に縮小するフィルタがあるとします。ここでSomeFilterは、手動でファイルリストを編集して、削除したくないものを保持することができます。

SomeFilter all-hidden-files.txt > list_files 

次のコマンドを使用すると、取り外し可能なファイルを提供しますlist_filesから欠落しているすべての-隠さ-files.txt、内の行を識別します。

comm -3 all-hidden-files.txt list_files > removable-files.txt 

編集:入力ファイルを並べ替える必要があることが分かりました。これは、

for i in $(<removable-files.txt); do rm $i; done; 
1

このような何かので、あなたはbashスクリプトでのexecを呼び出すことによってこれを行うことができます: -

find . -iname ".*" -exec bash -c "fgrep {} /tmp/list_files >/dev/null || rm -i {}" \; 

はあなたがあなたのリストを構築する方法は非常に注意してくださいファイル。除外するファイルのリストは、findによって生成された出力と同一でなければなりません。そうしないと、パターンに一致するすべてのファイルが削除されます。

私はrmに対話型オプションを付けました。これをテストに使用することをお勧めします。この方法でディレクトリを削除する場合は、rmオプションを変更する必要があります。

相対パスではなく絶対パスがより安全なオプションになりますが、除外が有効になるように検索を実行するのに使用するのと同じフォルダのfindを使用してファイルリストを構築することができますあなたの検索は

find /some/folder/name -name "some pattern" -exec .... 
1

がすべてを動かし、あなたのソースディレクトリに一時ディレクトリを作成しますが、これはあなたのためにうまく動作確認した後、何かのように生成されたファイルの一覧を削除することができ

comm -3 <(sort all-hidden-files.txt | uniq) <(sort list_files | uniq) \ 
    > removable-files.txt 

として使用しますtempディレクトリに保存するファイルを元の場所に移動し、tempディレクトリを再帰的に削除します。移動はすべて1つのファイルシステム上にあるので、まともなファイルシステムではほとんど瞬間的でなければならず、これはかなり安全です。

関連する問題