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

时间:2013-01-13 17:25:20

标签: linux rename batch-rename

我有这样的事情:

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

我希望将这些文件重命名为:

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

在同一目录中。

我想我可以使用rename,但我无法弄清楚如何在文件夹和文件重命名的同时使用它。

3 个答案:

答案 0 :(得分:23)

使用bash for循环和mv

可以实现结果
for subdir in *; do mv $subdir/file.txt $subdir.txt; done;

请注意,如果目录名称包含空格,则上述解决方案将无效。相关link

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

对我来说非常简单:

$ 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