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

20

我有类似这样的东西:

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会隐藏关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、特定的问题或错误以及重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整和可验证的示例 - jww
3个回答

36
可以通过使用Bash for循环和mv命令来实现该结果。
for subdir in *; do mv $subdir/file.txt $subdir.txt; done;

请注意,如果目录名中包含空格,则上述解决方案将无法正常工作。相关链接

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

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

1
$subdir 应该是 "$subdir",并且可以使用以下命令删除空文件夹:find . -type d -empty -exec rm -rf \{\} \; - giskou
如果你喜欢打字,单个s#/file##重命名会更容易输入,并且处于正确的抽象层级。一辈子重复相同的shell循环来重命名文件会很快变得乏味。 - tchrist
1
@giskou:我不明白为什么空文件夹会成为问题,因为mv命令会直接失败。此外,使用rm -rf删除空目录是过度杀伤力的,你可以使用rmdir,这样更加安全。 - Csq
@giskou:以上的find命令也可以修改为执行以下任务:find . -type d -not -empty -exec echo mv \"\{\}/file.txt\" \"\{\}.txt\" \; - Csq
对我来说不起作用:$ find . -type d -not -empty -exec echo mv \{\}/*.m4a \{\}.m4a \; - user4328677
显示剩余2条评论

2
您可以使用rnm。命令如下:

您可以使用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_* 

1

对我来说似乎很简单:

$ 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

2
子文件夹大约有130个,而不仅仅是3个:P - giskou
@giskou 我不明白为什么这很重要:我只是在演示这种技术是有效的。子目录的数量并不重要,除非你达到了 xargs 的限制,即使如此,由于 Perl 的 rename 可以从 stdin 读取文件名,所以这也是微不足道的。 - tchrist
我更倾向于使用bash而不是perl和正则表达式。如果您能详细解释一下您的技术...我真的不知道它是做什么的 :P - giskou
@gisou,您只需像在任何编辑器中使用的那样应用标准的搜索和替换命令,因此s/foo/bar/g将更改文件名中所有foo实例为bar实例,以此类推。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接