Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在bash中移动文件并自动重命名复制的文件而不覆盖现有文件的方法_Macos_Bash_Unix_Scripting_File Rename - Fatal编程技术网

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

Macos 在bash中移动文件并自动重命名复制的文件而不覆盖现有文件的方法,macos,bash,unix,scripting,file-rename,Macos,Bash,Unix,Scripting,File Rename,我正在用大量JPG对大量目录进行重大重组,其中一些与其他目录中的文件同名。我想将文件移动/复制到备用目录,如果名称与该目录中的另一个文件匹配,bash会自动重命名它们(将IMG_238.jpg重命名为IMG_238_COPY1.jpg,IMG_238;_COPY2.jpg等),而不是覆盖现有文件 我已经建立了一个脚本,它接受JPEG并根据exif数据将它们移动到一个新目录。移动一个jpg的脚本的最后一行是:mv-n“$JPEGFILE”“$DIRNAME” 我之所以使用-n选项,是因为我不想覆盖

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

我已经建立了一个脚本,它接受JPEG并根据exif数据将它们移动到一个新目录。移动一个jpg的脚本的最后一行是:
mv-n“$JPEGFILE”“$DIRNAME”

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

(如果有必要,我在MacOSX Lion中使用Bash3.2)。

这应该可以做到

# 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"
编辑:改进。

您可以尝试看看Ubuntu/Debian基于Perl的
重命名是否有效。它具有
sed
风格的功能。引用手册页(在我的系统上,但脚本应与链接的脚本相同):

“重命名”根据指定的规则重命名提供的文件名 作为第一个论点。perlexpr参数是一个Perl表达式 它至少会修改Perl中的$字符串中的一些 指定的文件名。如果给定的文件名未被 表达式,它将不会被重命名。如果服务器上未提供任何文件名 命令行中,将通过标准输入读取文件名

例如,重命名与“*.bak”匹配的所有文件以剥离 你可以说是分机

    rename 's/\.bak$//' *.bak
要将大写名称转换为小写名称,可以使用

    rename 'y/A-Z/a-z/' *

您使用的是哪个发行版,还是需要跨发行版?我使用的是Mac OSX Lion和bash 3.2。我将更新我的问题。您可能想看一看-它可以帮助您消除重复文件,因此,由于名称相同而“未移动”的任何文件实际上都是不同的文件。您可以安全地删除第一个
[-f“$DIRNAME/$JPEGFILE”]
您也可以安全地删除尾部或
| mv“$JPEGFILE”…
@holygeek:删除前导测试和备用mv将更改语义。我们不想在所有情况下都添加
\u COPY${n}
,只在需要时添加。
和&mv
的对比;mv
是非常正确的,我在第一次重读时就去掉了它。很抱歉,我的答案中有以下while条件:
while[-f“$DIRNAME/$JPEGFILE”];在你的答案出现之前做…
,所以我建议简化你的答案,而不是发布类似的答案。顺便说一句,
mv“$fname”“$DIR…”
如果
$JPEGFILE
有路径,我觉得这是错误的。@holygeek:你说得对,
$fname
不正确。它应该是
$JPEGFILE
。更正。