删除文件时排除文件名列表

删除文件时排除文件名列表

我想删除目录下所有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将参数传递给下一个命令,以零分隔,保留文件名。

-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选项。

相关内容