首页 > 解决方案 > 将具有特定扩展名的子目录文件重命名为父文件夹的名称

问题描述

我有许多文件夹,我需要将其中的一些文件重命名为特定扩展名,即“.jpeg”为父文件夹的名称加上其现有名称。

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

如何匹配子目录中的任何文件?

标签: linuxbashshell

解决方案


这很简单。
不需要ls/ grep,只需使用一个简单的 glob - 您确实需要循环,但请记住您是单独重命名文件,而不是整体重命名。

$: key="${PWD##*/}"
$: for f in *.jpeg; do mv "$f" "${key}_$f"; done

$PWD是当前记录的目录。 Bash 参数解析用于#从字符串的前面删除 glob 模式。##让它变得“贪婪”,尽可能匹配而不是最不匹配。这意味着"${PWD##*/}"尽可能多地从值的前面删除,直到它看到 a /(即,前导路径),只留下当前目录的名称。

其他工具还有其他方法,但除非你有无数,否则这将处理得很好。


推荐阅读