windows 或 linux,都可以,它在外部驱动器上,可以读取
例如,将项目的每个文件和文件夹中的“version2”更改为“version3”?
虽然在这种情况下我想将每个文件名和文件夹名中的患者姓名首字母更改为“patient-1”,但这有几十到几百个文件、几十 GB 和大约 10 个患者(需要更改十种不同的内容)。
答案1
在 Linux 中,我会用它find
来找到所有相关文件,然后rename
:
$ find . -name "*version2*" -exec rename version2 version3 {} \;
编辑:
为了澄清,根据@choroba下面的评论,这个解决方案涉及重命名 (1)作为 util-linux 包的一部分分发。
答案2
我从其他地方得到的答案,但我还没有尝试过,而且我不知道它是否是最佳的:
“这并不像我希望的那么优雅,但它将“*.txt”文件末尾的“-kr”更改为“-patient-123””
查找 . -type f -iname '*.txt' | perl -ne 'chomp; my $orig = $; 如果 (s/-kr(.txt)$/-patient-123$1/) { 打印“$orig\0$\0"; }' | xargs -0rn2 mv -i
“它只处理文件名,文件夹可以像这样单独处理:”
查找 . -type d | tac | perl -ne 'chomp; my $orig = $; 如果 (s/-kr$/-patient-123/) { 打印“$orig\0$\0"; }' | xargs -0rn2 mv -i
答案3
Linux下交互式解决方案:vidir
。参见我的这个答案。
Solevidir
不会进入子目录。你需要
find . | vidir -
或者类似
find . | EDITOR=kate vidir -
然后使用文本编辑器的“搜索和替换”功能进行所需的更改。保存文本文件(不要更改其名称)并退出编辑器。完成。
注意每个文件和目录都有自己独立的行。如果您需要将名为 的目录重命名version2
,version3
则必须更改其行以及与其子目录和文件相关的所有行。如果您只漏掉一个对象,那么您最终会得到两个目录:version2
和version3
(因此会mkdir
涉及)。确保您有权重命名/移动要更改的所有对象。即使您得到两个目录而不是一个,也仍然可以通过vidir
再次运行来解决这个问题(尽管其中一个目录可能具有错误的所有权/权限,因为它是新创建的)。
您要重命名的目录应位于其内容之前。幸运的是,find .
这种方式是可行的(除非使用-depth
,所以不要使用-depth
)。
另一方面,如果vidir
没有列出任何更深层次的内容(例如,您使用find
)-maxdepth
,那么您无需担心。重命名内容不在列表中的目录将像您使用 一样工作mv
。
无论如何,做出您要求的更改相对容易。很多都取决于所选的编辑器:使用正则表达式搜索、突出显示更改、撤消 - 诸如此类的功能可能会派上用场。
我发现vidir
在像您这样的情况中它很有用,主要是因为它允许我在进行任何重命名/移动之前确保生成的路径确实是我想要的。如果我搞砸了什么,我可以中止而不保存更改。
首先通过处理一些可消耗的目录来测试解决方案并熟悉该工具。注意当名称冲突时会发生什么。试验并根据您的需要调整方法。