将多个目录中的文件重命名为目录名

Posted

技术标签:

【中文标题】将多个目录中的文件重命名为目录名【英文标题】:Rename files in multiple directories to the name of the directory 【发布时间】:2012-12-27 16:26:45 【问题描述】:

我有这样的事情:

v_1/file.txt
v_2/file.txt
v_3/file.txt
...

我想将这些文件重命名为:

v_1.txt
v_2.txt
v_3.txt
...

在同一目录中。

我想我可以使用rename,但我不知道如何同时使用它来重命名文件夹和文件。

【问题讨论】:

Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example。 【参考方案1】:

结果可以通过 bash for 循环和mv

for subdir in *; do mv $subdir/file.txt $subdir.txt; done;

请注意,如果目录名称包含空格,上述解决方案将不起作用。相关link。

基于 cmets 的另一种解决方案(也适用于名称中包含空格的目录):

find . -type d -not -empty -exec echo mv \\/file.txt \\.txt \;

【讨论】:

$subdir 应该是 "$subdir" 并删除空文件夹 find . -type d -empty -exec rm -rf \\ \; @giskou 如果你喜欢打字。单个s#/file## 重命名更容易键入,并且处于正确的抽象级别。一生都在重复相同的 shell 循环来重命名文件会很快过时。 @giskou:我不明白为什么空文件夹会出现问题,因为mv 会失败。另外,用rm -rf 删除一个空目录是多余的,你可以简单地使用rmdir,这样更安全。 @giskou:上面的 find 命令也可以修改为完成任务:find . -type d -not -empty -exec echo mv \"\\/file.txt\" \"\\.txt\" \; 它对我不起作用:$ find . -type d -not -empty -exec echo mv \\/*.m4a \\.m4a \;【参考方案2】:

您可以使用rnm。命令是:

rnm -fo -dp -1 -ns '/pd0/.txt' -ss '\.txt$' /path/to/the/directory

-fo 表示仅文件模式。

-dp 目录深度。 -1 使其递归到所有子目录。

-ns 表示名称字符串,即文件的新名称。

/pd0/是要进行重命名操作的文件的直接父目录。

-ss 是一个搜索字符串(正则表达式)。 '\.txt$' 正则表达式搜索文件名末尾带有.txt 的文件。

/path/to/the/directory 这是 v_1、v_2 ... 目录所在的路径。您也可以传递目录 ( v_1, v_2 ...) 来代替父目录路径。例如:

#from inside the parent directory
rnm -fo -dp -1  -ns '/pd0/.txt' -ss '\.txt$' v_* 

【讨论】:

【参考方案3】:

对我来说似乎很简单:

$ mkdir /tmp/sandbox
$ cd /tmp/sandbox

$ mkdir v_1,2,3
$ touch v_1,2,3/file.txt

$ rename -v 's#/file##' v_1,2,3/file.txt
rename v_1/file.txt v_1.txt
rename v_2/file.txt v_2.txt
rename v_3/file.txt v_3.txt

$ ls -F
v_1/  v_1.txt    v_2/  v_2.txt    v_3/  v_3.txt

【讨论】:

子文件夹大约有 130 个,而不仅仅是 3 个:P @giskou 我不明白为什么这很重要:我只是在证明该技术有效。子目录的数量是无关紧要的,除非你达到了xargs 的限制,即使这也是微不足道的,因为 Perl rename 将读取标准输入上的文件名。 比起 perl 和正则表达式,我更喜欢 bash。如果你能详细解释你的技术......我真的不知道它是做什么的:P @gisou 您只需像在任何编辑器中一样应用标准搜索和替换命令,因此s/foo/bar/g 将文件名中所有foo 实例更改为bar 实例等。跨度>

以上是关于将多个目录中的文件重命名为目录名的主要内容,如果未能解决你的问题,请参考以下文章

Linux 重命名

如何使用 mv 命令重命名 unix 中的多个文件?

在 bash 脚本中获取祖父目录 - 为路径中的目录重命名文件

一次重命名多个文件的 C++ 程序

PHP 将多个文件/目录重命名为小写,删除空格和有趣的字符

linux 重命名文件和文件夹