我有类似这样的东西:
v_1/file.txt
v_2/file.txt
v_3/file.txt
...
而我想将这些文件重新命名为类似于这样的名称:
v_1.txt
v_2.txt
v_3.txt
...
在同一个目录下。
我想我可以使用rename
,但我不知道如何同时重命名文件夹和文件。
我有类似这样的东西:
v_1/file.txt
v_2/file.txt
v_3/file.txt
...
而我想将这些文件重新命名为类似于这样的名称:
v_1.txt
v_2.txt
v_3.txt
...
在同一个目录下。
我想我可以使用rename
,但我不知道如何同时重命名文件夹和文件。
mv
命令来实现该结果。for subdir in *; do mv $subdir/file.txt $subdir.txt; done;
请注意,如果目录名中包含空格,则上述解决方案将无法正常工作。相关链接。
另一种基于评论的解决方案(也适用于名称中包含空格的目录):
find . -type d -not -empty -exec echo mv \{\}/file.txt \{\}.txt \;
$subdir
应该是 "$subdir"
,并且可以使用以下命令删除空文件夹:find . -type d -empty -exec rm -rf \{\} \;
。 - giskous#/file##
重命名会更容易输入,并且处于正确的抽象层级。一辈子重复相同的shell循环来重命名文件会很快变得乏味。 - tchristmv
命令会直接失败。此外,使用rm -rf
删除空目录是过度杀伤力的,你可以使用rmdir
,这样更加安全。 - Csqfind . -type d -not -empty -exec echo mv \"\{\}/file.txt\" \"\{\}.txt\" \;
- Csq$ find . -type d -not -empty -exec echo mv \{\}/*.m4a \{\}.m4a \;
- user4328677您可以使用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_*
对我来说似乎很简单:
$ 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
xargs
的限制,即使如此,由于 Perl 的 rename
可以从 stdin 读取文件名,所以这也是微不足道的。 - tchrists/foo/bar/g
将更改文件名中所有foo
实例为bar
实例,以此类推。 - tchrist