我有很多文件夹,需要用特定的扩展名将其中的一些文件重命名为父文件夹的名称加上其现有名称。
META_10234
--- file1.jpeg
--- file2.jpeg
META2_10235
--- file1.jpeg
--- file2.jpeg
期望输出:
META_10234
---META_10234_file1.jpeg
---META_10234_file2.jpeg
我试过做这样的事情:
for file in $(ls | grep 'META_*'); do mv "./$file/*.jpeg" "./$f/$f*_.jpeg"; done;
错误为:
mv ./META_10234/.jpeg: No such file or directory
如何匹配子目录中的任何文件?
这非常简单
不需要ls
/grep
,只需使用一个简单的glob-您确实需要循环,但请记住,您是单独重命名文件,而不是集体重命名。
$: key="${PWD##*/}"
$: for f in *.jpeg; do mv "$f" "${key}_$f"; done
$PWD
是当前记录的目录。Bash参数解析使用#
从字符串前面删除glob模式。CCD_ 5使其成为";贪婪";,尽量匹配,而不是最少匹配。这意味着"${PWD##*/}"
将尽可能多地从值的前面删除,直到它看到/
(即前导路径(,只留下当前目录的名称。
使用其他工具还有其他方法,但除非你有无数的工具,否则它会处理得很好。