Bash

刪除文件時排除文件名列表

  • October 6, 2020

我想刪除目錄下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將參數傳遞給下一個以零分隔的命令,保留文件名。

-zflag 將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選項。

引用自:https://unix.stackexchange.com/questions/613079