名前がファイルリストの行と一致しないディレクトリ内のすべてのファイルを削除します。

名前がファイルリストの行と一致しないディレクトリ内のすべてのファイルを削除します。

1000を超えるファイルを含むディレクトリがあります。テキストファイルには、1行に1つずつ約50のファイル名があります。ファイル名がリストのエントリと一致しないディレクトリ内のすべてのファイルを削除したいと思います。最良のアプローチは何ですか?シェルスクリプトを起動しましたが、ファイル名がリストにあることを確認する正しいコマンドが見つかりませんでした。ありがとうございます。

ベストアンサー1

ファイルを削除する方法を尋ねる質問は非常に注意して行う必要があることを知っています。私の最初の答えはあまりにも早すぎて、ファイルリストがegrepで使用するのに間違った形式になる可能性があることを考慮していませんでした。このリスクを減らすために回答を編集しました。

これは、名前にスペースが含まれていないファイルに対して機能します。

まず、ファイルのリストを再作成して、正しいファイル名と一致することを確認します。

sed -e 's,^,^,' -e 's,$,$,'  filelist  > newfilelist 

rm コマンドのビルド

cd your_directory
ls | egrep -vf newfilelist   | xargs -n 1 echo rm  >  rmscript

rmスクリプトが機能していることを確認してください(「vim」または「less」を使用して実行できます)。
次に、次のようにします。

sh -x rmscript

ファイル名にスペースが含まれている場合("ファイル名にスペースが含まれていると機能しません):

ls | egrep -vf newfilelist  | sed 's,^\(.*\)$,rm "\1",' > rmscript

もちろん、ファイルのリストが同じディレクトリにあるべきではありません!

編集する:

Nathanのファイルリストには、ディレクトリ内のすべてのファイルと一致する名前が含まれています(たとえば、「html」は「bob.html」と一致します)。したがって、egrep -vfすべてのストリームが吸収されるため、何も削除されません。各ファイル名の周りに「^」と「$」を入れるコマンドを追加しました。幸いなことに、Nathanのファイルリストは正確でした。 CR-LF 行終了または追加の空白を使用する DOS 形式の場合、egrep はファイルを保持せず、すべてのファイルが削除されます。

おすすめ記事