我有一堆(大约10演出的价值)的文件,我需要从外部的Linux磁盘复制到Windows机器。 不幸的是一些包含“:”字符的文件名已经进入了这个集合。
这些冒号文件都不需要在Windows机器上,所以我需要快速解决scheme或重命名它们。
你会推荐什么? (我在Linux中假设像bash / perl / python脚本,在Windows机器上没有powershell。)
审查有问题的文件。
find /path/to/files -name '*:*' -print
删除有问题的文件。
find /path/to/files -name '*:*' -exec rm {} +
用下划线重命名有问题的文件。
find /path/to/files -name '*:*' -exec rename ':' '_' {} +
对于更高效的Dan C版本,删除一些UNIX变体支持:
find /path/to/files -name '*:*' -delete
这就避免了每一个匹配文件都需要fork和exec /bin/rm
。
这个-delete
选项在MacOS X和我的FC11系统上(使用findutils-4.4.0
)。 我不知道多久以前它被添加到findutils
。
你可以通过做删除所有的文件
rm *:*
在Linux的目录中。
这应该删除所有包含冒号的文件。
或者你可以使用rename命令重命名它们
rename 'y/(.*):(.*)/$1$2/' *
这将取代testing:东西是testing的东西
最简单的方法可能是压缩整个结构,并将文件解压缩到Windows磁盘。 解压缩知道如何重新映射非法字符。
需要你有磁盘空间虽然:(
如果你想改变文件名(不修改源目录),GNU tar有一个–transform选项。
tar cf - -C $SOURCE_DIR . --transform=s/:/_/g | tar xf - -C $DEST_DIR
您也可以使用–exclude选项来避免这些文件。
tar cf - -C $SOURCE_DIR . --exclude='*:*' | tar xf - -C $DEST_DIR
在我工作的RHEL5机器上,我没有看到–transform选项,但是我认为这很常见。
也,
mmv ";*:*" "#1#2#3"
或类似的命令也应该做的伎俩。 先用-nv运行它,看看什么会被移到什么地方,而不会实际修改任何东西
这实际上应该是对上面最被select的答案的评论,但是我不能(也)应用评论。
我有这个版本的Debian jessie系统重命名。
$ rename -V /usr/bin/rename using File::Rename version 0.20
我通过使用:
find . -name '*:*' -exec rename 's/:/_/g' {} \;
但是,有一个副作用。 所有文件的时间戳改变了。