18

我有这样的事情:

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

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

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

在同一目录中。

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

4

3 回答 3

33

结果可以通过 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 \;
于 2013-01-13T17:35:08.967 回答
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_* 
于 2016-01-29T13:10:36.813 回答
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
于 2013-01-13T17:32:35.440 回答