大多数视网膜显示图像以@2x.png
结尾,并且通常在同一文件夹中具有正常.png
。那么,只有在file.png
存在于同一文件夹中时,找到并删除file@2x.png
(递归)的最快方法是什么?
答案 0 :(得分:2)
您可以使用参数替换检查没有@2x
的文件,并删除包含@2x
的文件,例如:
#!/bin/bash
while read -r line; do
printf "found '%s' -> rm '%s'\n" "${line/@2x}" "$line"
# [ -f "${line/@2x}" ] && rm "$line"
done < <(find "$1" -type f -name "*@2x.png")
示例使用/输出
$ bash retinadel.sh dat
found 'dat/tmp/first.png' -> rm 'dat/tmp/first@2x.png'
...
(注意:代码期望$path
作为第一个参数,并且当前有rm
注释,因此您可以在实际尝试删除之前进行测试。始终确保你在删除有价值的文件之前有备份......)
note2:您应该在脚本的开头添加一个测试,以验证路径的至少1个输入。 e.g:
[ -z "$1" ] && { ## validate at least one argument provided
printf "error: insufficient input, usage: %s path\n" "${0##*/}"
exit 1
}
这样,如果用户(您)未能提供path
作为参数,您会收到:
$ bash retinadel.sh
error: insufficient input, usage: retinadel.sh path
答案 1 :(得分:1)
我很确定通过一些令人费解的find -exec
可以实现,但我无法弄明白。这适用于我的小测试:
$ find -maxdepth 1 -name '*@2x.png' | sed 's/@2x//' | xargs echo rm
这将查找当前目录(@2x.png
)中以-maxdepth 1
结尾的所有文件,已删除@2x
位并打印rm
和文件名。要实际删除它们,必须是xargs rm
;要避免被提示,请使用rm -f
,并谨慎使用rm -i
。
答案 2 :(得分:0)
这应该做:
find /path/to/folder -name '*@2.png' -type f -exec bash -c 'f=${0%@2.png}.png; [[ -f $f ]] && echo rm -- "$f"' {} \;
或者,限制产生的bash
进程的数量:
find /path/to/folder -name '*@2.png' -type f -exec bash -c 'for i; do f=${i%@2.png}.png; [[ -f $f ]] && echo rm -- "$f"; done' _ {} +
请注意,这些命令不会删除任何内容,只是将标准输出打印到将要执行的rm
命令。如果您对此感到满意,请移除echo
前面的rm
。