在Linux中批量重命名或删除

我有一堆(大约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' {} \; 

但是,有一个副作用。 所有文件的时间戳改变了。