1000以上のファイルがあるディレクトリがあります。テキストファイルには、1行に1つずつ、約50のファイル名があります。ファイル名がリストのエントリと一致しないディレクトリ内のすべてのファイルを削除したいのですが。これを行うための最良の方法は何ですか?シェルスクリプトを開始しましたが、ファイル名がリストにあるかどうかを判断するための適切なコマンドを判断できませんでした。ありがとう。
承認された回答:
ファイルを削除する方法を尋ねる質問には細心の注意を払う必要があることを理解しています。
最初の答えは速すぎて、ファイルリストが不正に作成されて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
のため、何も削除されませんでした すべてのストリームを吸収しました。各ファイル名の前後に「^」と「$」を付けるコマンドを追加しました。ネイサンのファイルリストが正しかったのは幸運でした。 CR-LFで終了する行または追加のスペースを使用してDOS形式になっているとしたら、egrepによってファイルが保持されず、すべてが削除されます。