Gil*_*il' 42
许多 GNU 工具,例如cp
,mv
和tar
支持在目标存在时创建备份文件。也就是说,在复制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 手册。
我试过
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 ) 通常需要屏蔽。