我的照片库一团糟。我有这样的文件:
image-1.jpg
image-1.jpeg
image-2.jpg
Run Code Online (Sandbox Code Playgroud)
现在,当存在同名但扩展名为 .jpg 的文件时,我想删除所有扩展名为 .jpeg 的照片。
我怎样才能做到这一点?
for f in *.jpeg; do
[ -e "${f%.*}.jpg" ] && echo rm -- "$f"
done
Run Code Online (Sandbox Code Playgroud)
(echo
如果高兴就删除)。
随着zsh
和一个rm
调用:
echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')
Run Code Online (Sandbox Code Playgroud)
(更改*
为**/*
递归执行,添加D
glob 限定符,如果您还想考虑隐藏文件或隐藏目录中的文件)。
对类似问题的答案的改编:
\n\nfind . -type f -name \'*.jpeg\' -exec sh -c \'\n for pathname do\n jpg_pathname=${pathname%.jpeg}.jpg\n if [ -f "$jpg_pathname" ]; then\n printf "Would remove %s\\n" "$pathname"\n # rm "$pathname"\n fi\n done\' sh {} +\n
Run Code Online (Sandbox Code Playgroud)\n\n.jpeg
这将查找当前目录中或当前目录下具有文件名后缀的所有文件的路径名。对于尽可能大批量的这些路径名,将调用一个简短的内联脚本。该脚本循环遍历当前批次的路径名,并检测具有相同文件名主干后跟.jpg
. 如果一个.jpeg
文件有对应的.jpg
文件,则该.jpeg
文件被删除(如果注释掉的rm
被激活)。
较短的版本(删除了安全注释并且没有文本输出):
\n\nfind . -type f -name \'*.jpeg\' -exec sh -c \'\n for pathname do\n [ -f "${pathname%.jpeg}.jpg" ] && rm "$pathname"\n done\' sh {} +\n
Run Code Online (Sandbox Code Playgroud)\n\n(您会注意到,这结果是St\xc3\xa9phane Chazelas\' 答案的递归变体)
\n