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

发布于 2024-12-23 07:24:28 字数 468 浏览 0 评论 0原文

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

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

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

(如果重要的话,我在 Mac OSX Lion 中使用 bash 3.2)。

I'm doing some major restructuring of large numbers of directories with tons of jpgs, some of which my have the same name as files in other directories. I want to move / copy files to alternate directories and have bash automatically rename them if the name matches another file in that directory (renaming IMG_238.jpg to IMG_238_COPY1.jpg, IMG_238_COPY2.jpg, etc), instead of overwriting the existing file.

I've set up a script that takes jpegs and moves them to a new directory based on exif data. The final line of the script that moves one jpg is: mv -n "$JPEGFILE" "$DIRNAME"

I'm using the -n option because I don't want to overwrite files, but now I have to go and manually sort through the ones that didn't get moved / copied. My GUI does this automatically... Is there a relatively simple way to do this in bash?

(In case it matters, I'm using bash 3.2 in Mac OSX Lion).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦幻的味道 2024-12-30 07:24:28

这应该可以做到

# 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"

编辑:改进。

This ought to do it

# 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"

EDIT: Improved.

青萝楚歌 2024-12-30 07:24:28

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

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

例如,重命名所有匹配“*.bak”的文件以去除
扩展,你可能会说

 重命名 's/\.bak$//' *.bak

要将大写名称转换为小写名称,您可以使用

 重命名 'y/AZ/az/' *

You can try downloading and seeing if Ubuntu/Debian's Perl-based rename works. It has sed-style functionality. Quoth the man page (on my system, but the script should be the same one as linked):

"rename" renames the filenames supplied according to the rule specified
as the first argument. The perlexpr argument is a Perl expression
which is expected to modify the $_ string in Perl for at least some of
the filenames specified. If a given filename is not modified by the
expression, it will not be renamed. If no filenames are given on the
command line, filenames will be read via standard input.

For example, to rename all files matching "*.bak" to strip the
extension, you might say

    rename 's/\.bak$//' *.bak

To translate uppercase names to lower, you'd use

    rename 'y/A-Z/a-z/' *
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文