list.txtの名前ファイルを除くフォルダのファイルを削除するには?

list.txtの名前ファイルを除くフォルダのファイルを削除するには?

フォルダに/photo多くのファイルがあるとします。

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
10.jpg

nodeletelist.txtこのテキストファイルには、削除しないファイルリストの名前とともにファイル名があります。

1.jpg
2.jpg
3.jpg
nodeletelist.txt

ファイルを削除するには:

4.jpg
...
10.jpg

ファイルを除いて1.jpg2.jpgとは何3.jpgですか?nodeletelist.txtnodeletelist.txt

ベストアンサー1

GNUの発見はありますか?

find photo -mindepth 1 -maxdepth 1 -regextype awk \! -regex ".*/($(tr '\n' '|' < photo/nodeletelist.txt)nodeletelist.txt)" -delete

これはtr(1)およびを使用して達成されますfind(1)

  1. ファイルを次にリダイレクトtr
  2. 改行を「OR」を意味する垂直バーに置き換えます。
  3. サブシェルから戻る
  4. ファイルが改行で終わる場合は、最後にフラグ値を追加します。 (この例ではあなたの名前をウォッチャーとして使用するため、nodeletelist.txtこのソリューションを使用する場合はファイルにファイル名を含める必要はありません。)
  5. ディレクトリ内の1レベル以下のアイテムを検索してください。photo
  6. awk正規表現を使用して、上記の手順1〜4で返された文字列を一致させます。
  7. ファイルの削除いいえ正規表現と一致する(!「NOT」を意味するため)

ここに必要な拡張構文がそのフラグに適用されるため、ここのフラグは、、、またはに-regextype設定することもできます。デフォルトのfindutils正規表現、posix-basic、emacs、sedなどは、このコマンドでは機能しません。posix-extendedegrepposix-egrepgnu-awkposix-awk

おすすめ記事