当不存在(1)或(2)的文件时,删除该文件

当不存在(1)或(2)的文件时,删除该文件

我的照片库一团糟。由于一些副本,我的图像看起来像这样:

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).pngsomefile (2).png但没有somefile.png,那么somefile (1).png和都somefile (2).png将被保留。如果这可能是一个问题,运行上面的命令后,您可以(1)使用以下命令重命名所有文件perl-renamerename在 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

这不会删除重复的文件名,而是删除具有相同内容的连续文件。

相关内容