删除非视网膜显示图像的最快bash脚本是什么(删除正常" png"仅当" @ 2x.png"存在时)?

时间:2016-02-20 08:59:20

标签: bash

大多数视网膜显示图像以@2x.png结尾,并且通常在同一文件夹中具有正常.png。那么,只有在file.png存在于同一文件夹中时,找到并删除file@2x.png(递归)的最快方法是什么?

3 个答案:

答案 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