GNU/Linux >> Linux の 問題 >  >> Linux

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

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によってファイルが保持されず、すべてが削除されます。


Linux
  1. 名前がBashの2つのパターンに一致するすべてのファイルを開くまたは一覧表示するにはどうすればよいですか?

  2. 指定されたファイル名のファイルが内部にないすべてのディレクトリを一覧表示しますか?

  3. symlink ディレクトリ内のファイルを含む、ディレクトリ内のすべてのファイルを再帰的に一覧表示する

  1. ディレクトリ内のすべてのファイルを解凍します

  2. ディレクトリのすべてのファイルを空にする linux コマンド

  3. バイナリファイルを除くすべてのサブディレクトリ内のすべての通常ファイルを一覧表示/検索します

  1. 一部を除くディレクトリ内のすべてのファイルを削除する方法は?

  2. scp を使用してファイルの .txt ファイル リストを転送する

  3. ディレクトリ内のすべてのフォルダ/ファイルにデフォルトのファイル権限を設定する方法は?