我有一棵巨大的文件树。某些文件具有相同的名称,但大小写不同,例如some_code.c
和Some_Code.c
。
因此,当我尝试将其复制到NTFS / FAT文件系统时,它会询问我是要替换文件还是跳过文件。
是否有任何方法可以自动重命名此类文件,例如,通过添加 (1)
冲突文件的名称(如Windows 7一样)?
我有一棵巨大的文件树。某些文件具有相同的名称,但大小写不同,例如some_code.c
和Some_Code.c
。
因此,当我尝试将其复制到NTFS / FAT文件系统时,它会询问我是要替换文件还是跳过文件。
是否有任何方法可以自动重命名此类文件,例如,通过添加 (1)
冲突文件的名称(如Windows 7一样)?
Answers:
许多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)
还有其他变体,例如仅在已经存在的情况下创建编号备份。有关更多详细信息,请参见coreutils手册。
brew install coreutils
,然后改用命令gcp
。
我试过了
apropos copy | grep "(1)"
找到可能的候选人,然后出现了mcopy。
man mcopy
显示一个有前途的选择-D clash-option
不是很酷吗?但不是很酷-没有描述。但是有一些关于mtools.dvi的提示,我在系统上进行搜索但没有成功,并且通过google进行了搜索,但没有成功,但是随后我使用google直接搜索mcopy clash-option
并找到了该站点。
我做了一个简短的测试
mcopy -D A f* a
测试自动重命名和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}
这是我的测试调用:
find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"
注意:-maxdepth,-name和-type用于极大地限制受影响的文件数量。我没有测试脚本是否具有更深的文件结构,也没有测试文件名中的空格以及其他诸如换行,换页等时髦字符。
我使用.1是因为它在大多数命令中都不会造成麻烦,而(和a)通常需要屏蔽。
cp
至少不是GNU 。
强烈建议您不要使用重复的文件名(忽略大小写),它们只会使您感到痛苦。使用以下内容查找此类重复项的列表
find . | tr A-Z a-z | sort | uniq -d
然后,如果输出,则为每行手动重命名文件之一。尽量避免在将来创建重复项。
sudo fdisk -l /dev/sda
)上产生一个具有相同名称的文件,并touch foo; touch Foo
以2个文件foo
和结尾,则会出现什么样的错误Foo
。但是我不奇怪重启Windows来看看它们在那儿的样子。难道这只是一个FAT问题?啊-我有一个带FAT的USB-Stick,可以在文件内创建FAT系统,...-请稍等。:)