ファイル削除時のファイル名リストの除外

ファイル削除時のファイル名リストの除外

ディレクトリ内のassets/img/fly不要なファイルをすべて削除したいと思います_posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown。除外するファイルは次のとおりです。

± |master → origin U:1 ✗| → grep '.jpg' _posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown 
![](/assets/img/fly/UEGDXB3U.jpg)
![](/assets/img/fly/YB59X0IS.jpg)
![](/assets/img/fly/8FBFIDB3.jpg)
![](/assets/img/fly/CGMZAZU6.jpg)
![](/assets/img/fly/HNW7TV6D.jpg)
![](/assets/img/fly/UZRLR5TE.jpg)
![](/assets/img/fly/F6RZHWOD.jpg)
![](/assets/img/fly/LEDROO88.jpg)
![](/assets/img/fly/4LOGZOM0.jpg)
![](/assets/img/fly/OFGII4Z3.jpg)
![](/assets/img/fly/IGTJ2LYH.jpg)
![](/assets/img/fly/UOM780JG.jpg)
![](/assets/img/fly/WY28RY5O.jpg)
![](/assets/img/fly/TVDZMBDI.jpg)

ディレクトリの完全なファイルは次のとおりです。

± |master → origin U:1 ✗| → ls assets/img/fly
4LOGZOM0.jpg CGMZAZU6.jpg HNW7TV6D.jpg LEDROO88.jpg OFGII4Z3.jpg TVDZMBDI.jpg UOM780JG.jpg WY28RY5O.jpg YB59X0IS.jpg
8FBFIDB3.jpg F6RZHWOD.jpg IGTJ2LYH.jpg LVPJ7B4F.jpg RDO3AY0Z.jpg UEGDXB3U.jpg UZRLR5TE.jpg XISY5DZD.jpg YIXITHTJ.jpg

プロセスは、grep出力コマンドからファイル名を抽出し、それをls

答え1

#!/bin/bash
d="assets/img/fly"
f="_posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown"
 
find "$d" -type f -print0 | 
    grep -vzf <(grep -o "assets.*jpg" "$f") | xargs -0 echo rm --

echoテストが正常な場合は削除してください。また、実行場所に基づいてMarkdownファイルへのパスを調整する必要があるかもしれません。

find-print0ファイル名を保持しながら、ゼロで区切られた引数を次のコマンドに渡して、ディレクトリ内のすべてのファイルを取得します。

-zフラグを使用すると、grepこれらの引数は改行ではなくゼロ区切り文字でフィルタリングされます。-f引数で最初のファイルのパターンを探し、一致-vする引数を除外します。

パターンを持つファイルは実行中のプロセスに置き換えられ、grep -o除外するファイルの完全なファイル名が返されます。また、xargs -0引数をゼロで区切られたものとして扱います。


すべてのファイルが例と同じであると仮定し、ファイル名を保持しないバージョンは次のとおりです。

#!/bin/bash
d="assets/img/fly"
f="_posts/2020-10-05-most-beautiful-story-i-ve-ever-heard.markdown"
 
find "$d" -type f | grep -vf <(grep -o "assets.*jpg" "$f") | xargs echo rm --

注:macOS GNU grepはオプションをサポートしていません-z

関連情報