我的照片库一团糟。由于一些副本,我的图像看起来像这样:
IMG_20220505_1701.jpg
IMG_20220505_1701 (1).jpg
IMG_20220505_1701 (2).jpg
现在,我想删除其名字中包含 (1) 或 (2) 的每张照片,但仅限于不存在该文件的文件时。我怎样才能做到这一点?
答案1
如果存在没有数字的文件,这将删除名称中带有括号的数字的所有文件:
for file in *'('* ; do
origFile=$(sed 's/ *([0-9]*)//' <<<"$file")
[ -e "$origFile" ] && [ "$file" != "$origFile" ] && rm -- "$file"
done
请注意,如果不存在没有数字的文件,这将保留所有数字文件。因此,例如,如果您有somefile (1).png
和somefile (2).png
但没有somefile.png
,那么somefile (1).png
和都somefile (2).png
将被保留。如果这可能是一个问题,运行上面的命令后,您可以(1)
使用以下命令重命名所有文件perl-rename
(rename
在 Ubuntu 和其他基于 Debian 的发行版上调用):
rename -- 's/ \(1\)//' *'(1)'*
然后再次运行第一个命令以仅保留一个。如果您还遇到只存在(2)
或文件的情况,您可能需要尝试一下(N)
。
答案2
使用zsh
,您可以执行以下操作:
rename-or-delete() {
if [[ -e $2 ]]; then
rm -- $1
else
mv -- $1 $2
fi
}
autoload zmv
zmv -n -f -P rename-or-delete '(*) \(<->\)(.jpg)' '$1$2'
(-n
如果愿意,请删除以进行空运行)。
答案3
不完全是你所要求的(并且未经测试),但我认为它本着同样的精神:
#!/bin/sh
last=x
for i in * ; do
if [ -f "$i" ] ; then
if cmp "$last" "$i" ; then
rm -f "$i"
else
last="$i"
fi
fi
done
这不会删除重复的文件名,而是删除具有相同内容的连续文件。