【发布时间】:2017-01-05 19:06:28
【问题描述】:
我在这样的目录结构中有一堆文件:
Dir
SubDir
File
File
Subdir
SubDir
File
File
File
抱歉,格式混乱,但您可以看到所有不同目录级别的文件。所有这些文件名都有一个由 7 个数字组成的字符串,如下所示:1234567_filename.ext。我正在尝试删除文件名开头的数字和下划线。
现在我正在使用 bash 并使用这个 oneliner 使用 mv 和 cut 重命名文件:
for i in *; do mv "$i" "$(echo $i | cut -d_ -f2-10)"; done
这是在我 CD 进入目录时运行的。我很想找到一种方法来递归地执行此操作,以便它只重命名文件,而不是文件夹。我还在 shell 中使用了一个 foreach 循环,在 bash 之外的目录中有一堆包含文件的文件夹,并且没有其他子目录:
foreach$ set p=`echo $f | cut -d/ -f1`
foreach$ set n=`echo $f | cut -d/ -f2 | cut -d_ -f2-10`
foreach$ mv $f $p/$n
foreach$ end
但这只有在文件夹中没有其他子目录时才有效。
我可以使用循环或单行器来重命名目录中的所有文件吗?我什至尝试使用find,但不知道如何将cut 合并到代码中。
非常感谢任何帮助。
【问题讨论】:
-
您要删除号码和
_吗? -
拍摄,是的,抱歉,正要编辑帖子以澄清这一点。
-
set不用于设置普通变量,end不是bash关键字。 -
foreach循环仅在常规 shell 中在 bash 之外使用。 -
对你拥有的东西做一个小调整怎么样:for i in
find .;做 mv "$i" "$(echo $i | cut -d_ -f2-10)";完毕。基本上,将您的 * 替换为find .。呃,不知道如何打印反引号,只是添加这个作为答案......
标签: bash macos directory sh batch-rename