使用重命名复制文件

Ale*_*oba 29 file-copy rename

我有一个巨大的文件树。一些文件具有相同的名称但大小写不同,例如,some_code.cSome_Code.c

因此,当我尝试将其复制到 NTFS/FAT 文件系统时,它会询问我是否希望它替换文件或跳过它。

有没有办法自动重命名此类文件,例如,通过添加 (1)到冲突文件的名称(如 Windows 7 那样)?

Gil*_*il' 42

许多 GNU 工具,例如cp,mvtar支持在目标存在时创建备份文件。也就是说,在复制foo到 时bar,如果已经有一个名为 的文件bar,则现有的 bar将被重命名,复制bar后将包含foo. 默认情况下,bar重命名为bar~,但可以修改行为:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo ? foo~
cp -r --backup=t source target  #   rename foo ? foo.~1~ (or foo.~2~, etc)
Run Code Online (Sandbox Code Playgroud)

还有其他变体,例如仅在已存在的情况下创建编号备份。有关更多详细信息,请参阅coreutils 手册

  • OSX cp 没有 --backup 标志。使用`brew install coreutils`,然后使用命令`gcp`。 (2认同)

use*_*own 6

我试过

apropos copy | grep "(1)" 
Run Code Online (Sandbox Code Playgroud)

寻找可能的候选人,然后 mcopy 出现了。

man mcopy 
Run Code Online (Sandbox Code Playgroud)

显示一个有前途的选择-D clash-option是不是很酷?但不是很酷 - 它没有被描述。但是mtools.dvi有一些提示,我在我的系统上搜索过,没有成功,通过google,也没有成功,但是后来,用google,我直接搜索mcopy clash-option找到了这个站点

我做了一个简短的测试

mcopy -D A f* a 
Run Code Online (Sandbox Code Playgroud)

测试 autorename 和 targetdir a- 它没有自动重命名它要求我忽略或覆盖每个文件,那个愚蠢的 s... 。

我的版本是mtools-4.0.10,帮助页面是 1996 年 - 15 岁。与此同时,我们真的应该失去一些功能吗?

我会将工作分为两步:

  • 制作一个简短的函数,如果该名称被占用,它会为文件生成一个唯一的名称。
  • 运行find,并为您要复制的每个文件执行该脚本。

我们应该协助这种方法吗?:)

这是一个脚本,用于自动重命名文件:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 
Run Code Online (Sandbox Code Playgroud)

这是我的测试调用:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"
Run Code Online (Sandbox Code Playgroud)

注意:-maxdepth、-name 和-type 用于显着限制受影响文件的数量。我没有测试脚本的更深层次的文件结构,也没有测试文件名中的空格和其他时髦的字符,比如换行、换页等等。

我使用 .1 是因为它不会在大多数命令中造成麻烦,而 a ( 和 a ) 通常需要屏蔽。