我想删除目录下所有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
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
选项。