find . -type f -name '*.jpeg' -exec sh -c '
for pathname do
jpg_pathname=${pathname%.jpeg}.jpg
if [ -f "$jpg_pathname" ]; then
printf "Would remove %s\n" "$pathname"
# rm "$pathname"
fi
done' sh {} +
readonly path="${1:-./}"
for file in "${path}"*.jpeg; do
if [[ -f ${file%.jpeg}.jpg ]]; then
rm -- "$file"
printf '%s\n' "removed duplicate file ${file}"
fi
done
echo
(如果高兴就删除)。一次调用
zsh
:rm
(更改
*
为**/*
递归执行此操作,添加D
glob 限定符,如果您还想考虑隐藏文件或隐藏目录中的文件)。对类似问题的答案的改编:
这将在当前目录中或当前目录下查找所有带有
.jpeg
文件名后缀的文件的路径名。对于尽可能多的这些路径名,调用一个简短的内嵌脚本。该脚本循环遍历当前批次的路径名,并检测具有相同文件名词干的任何文件,后跟.jpg
. 如果一个.jpeg
文件有对应.jpg
的文件,则该.jpeg
文件被删除(如果注释掉rm
被激活)。较短的版本(删除了安全注释并且没有文本输出):
(您会注意到这是Stéphane Chazelas 答案的递归变体)
顶部的只读变量让您将目录的路径作为 arg 传递给脚本。如果没有给出 arg,它默认为当前目录。
它只是循环遍历由 var 路径指定的目录中以 '.jpeg' 结尾的所有文件。然后它会去除扩展名并测试是否存在具有 .jpg 扩展名的相同文件。如果 .jpg dup 存在,则 .jpeg 文件被视为 dup,并将其删除。
当前答案回答了问题正文中的特定情况,但对于删除所有其他文件的情况,我将Stéphane Chazelas 的答案与排除glob 匹配的答案结合起来: