在 Linux 中批量重命名或删除

在 Linux 中批量重命名或删除

我有一堆(大约 10 GB)文件需要从外部 Linux 磁盘复制到 Windows 计算机。不幸的是,一些包含“:”字符的文件名已进入此集合。

这些冒号文件都不需要放在 Windows 机器上,所以我需要一个快速的解决方案来删除或重命名它们。

你们都推荐什么?(我假设 Linux 中有类似 bash / perl / python 脚本的东西。Windows 机器上没有 powershell。)

答案1

审查有问题的文件。

find /path/to/files -name '*:*' -print

删除有问题的文件。

find /path/to/files -name '*:*' -exec rm {} +

用下划线重命名有问题的文件。

find /path/to/files -name '*:*' -exec rename ':' '_' {} +

答案2

为了获得更高效的 Dan C 版本,请删除一些 UNIX 变体支持:

find /path/to/files -name '*:*' -delete

/bin/rm这避免了对每个匹配的文件进行 fork 和 exec 的需要。

这个-delete选项在 MacOS X 和我的 FC11 系统(带有)上都有findutils-4.4.0。我不知道它是多久前添加到的findutils

答案3

您可以通过以下方式删除所有文件

rm *:*

在 Linux 机器上的目录中。

这将删除所有包含冒号的文件。

或者你可以使用重命名命令重命名它们

rename 'y/(.*):(.*)/$1$2/' *

这将取代 test:something 成为 testsomething

答案4

如果您想在运行中更改文件名(不修改源目录),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 选项,但我认为它在其他地方很常见。

相关内容