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

我有这样的东西:

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

我想重新命名这些文件是这样的:

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

在同一个目录下。

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

Solutions Collecting From Web of "将多个目录中的文件重命名为该目录的名称"

结果可以用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 \; 

对我来说很简单:

 $ 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 

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