在 bash 中移动文件并自动重命名复制文件而不覆盖现有文件的方法

Vic*_*Hee 3 unix macos bash scripting file-rename

我正在对大量带有大量 jpg 的目录进行重大重组,其中一些与其他目录中的文件具有相同的名称。我想移动/文件复制到备用目录,并具有自动的bash如果该名称在目录中的另一个文件重命名匹配他们(重命名IMG_238.jpgIMG_238_COPY1.jpgIMG_238_COPY2.jpg等),而不是覆盖现有文件。

我已经设置了一个脚本,它接受 jpeg 并将它们移动到基于 exif 数据的新目录。移动一个 jpg 的脚本的最后一行是:mv -n "$JPEGFILE" "$DIRNAME"

我正在使用 -n 选项,因为我不想覆盖文件,但现在我必须手动对没有移动/复制的文件进行排序。我的 GUI 会自动执行此操作...在 bash 中是否有相对简单的方法来执行此操作?

(以防万一,我在 Mac OSX Lion 中使用 bash 3.2)。

Sor*_*gal 5

这应该这样做

# strip path, if any
fname="${JPEGFILE##*/}"
[ -f "$DIRNAME/$fname" ] && {
    n=1
    while [ -f "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" ] ; do
        let n+=1
    done
    mv "$JPEGFILE" "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}"
} || mv "$JPEGFILE" "$DIRNAME"
Run Code Online (Sandbox Code Playgroud)

编辑:改进。

  • 抱歉,我的回答是针对 while 条件的:``while [ -f "$DIRNAME/$JPEGFILE" ]; 做 ...`` 在你的答案出现之前,所以我想我建议简化你的答案而不是发布类似的答案。顺便说一下,如果 ``$JPEGFILE`` 有路径,``mv "$fname" "$DIR..."`` 在我看来是错误的。 (2认同)