Bash
刪除文件時排除文件名列表
我想刪除目錄下
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
. 確切的命令現在對我來說很棘手。
#!/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
如果您對測試沒問題,請刪除。此外,您可能需要調整降價文件相對於執行位置的路徑。
find
將獲取您目錄的所有文件,-print0
將參數傳遞給下一個以零分隔的命令,保留文件名。
-z
flag 將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
選項。