我有这样的事情:
v_1/file.txt
v_2/file.txt
v_3/file.txt
...
我希望将这些文件重命名为:
v_1.txt
v_2.txt
v_3.txt
...
在同一目录中。
我想我可以使用rename
,但我无法弄清楚如何在文件夹和文件重命名的同时使用它。
答案 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