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

删除非视网膜显示图像的最快bash脚本是什么(仅当存在@2x.png时才删除正常的“png”?,bash,Bash,大多数视网膜显示图像以@2x.png结尾,通常在同一文件夹中有一个正常的.png。那么,只有在file@2x.png是否存在于同一文件夹中?您可以使用参数替换来检查不带@2x的文件,并删除包含@2x的文件,方法如下: #!/bin/bash while read -r line; do printf "found '%s' -> rm '%s'\n" "${line/@2x}" "$line" # [ -f "${line/@2x}" ] && rm "$

大多数视网膜显示图像以
@2x.png
结尾,通常在同一文件夹中有一个正常的
.png
。那么,只有在
file@2x.png
是否存在于同一文件夹中?

您可以使用参数替换来检查不带
@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")
注意:代码要求将
$path
作为第一个参数,并且当前注释了
rm
,因此您可以在实际尝试删除之前进行测试。在删除有价值的文件之前,始终确保您有备份…)

注意2:您应该在脚本开头添加一个测试,以验证路径的至少1个输入。e、 g:

[ -z "$1" ] && {  ## validate at least one argument provided
    printf "error: insufficient input, usage: %s path\n" "${0##*/}"
    exit 1
}
这样,如果用户(您)未能提供
路径
作为参数,您将收到:

$ bash retinadel.sh
error: insufficient input, usage: retinadel.sh path

我非常肯定,如果使用一些复杂的
find-exec
,这是可能的,但我想不出来。不过,这对我的小测试有效:

$ find -maxdepth 1 -name '*@2x.png' | sed 's/@2x//' | xargs echo rm
这将查找当前目录中以
@2x.png
结尾的所有文件(
-maxdepth 1
),并删除
@2x
位并打印
rm
和文件名。要实际删除它们,is必须是
xargs rm
;为避免出现提示,请使用
rm-f
,为谨慎起见,请使用
rm-i

这应该做到:

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
命令打印到标准输出。如果您对
rm
满意,请删除
echo
前面的
echo

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' _ {} +