用于多文件夹文件重命名的更惯用的BASH脚本

时间:2014-10-20 13:44:41

标签: bash rename idiomatic

我目前正在使用一堆单行来重命名bash中生成的图标文件。

for f in black/*.png ; do mv $f "${f%%.png}_black.png" ; done
for f in blue/*.png ; do mv $f "${f%%.png}_blue.png" ; done
for f in brown/*.png ; do mv $f "${f%%.png}_brown.png" ; done
for f in green/*.png ; do mv $f "${f%%.png}_green.png" ; done
for f in grey/*.png ; do mv $f "${f%%.png}_grey.png" ; done
for f in red/*.png ; do mv $f "${f%%.png}_red.png" ; done
for f in white/*.png ; do mv $f "${f%%.png}_white.png" ; done
for f in yellow/*.png ; do mv $f "${f%%.png}_yellow.png" ; done

但男孩啰嗦。鉴于文件夹结构,我是否可以使用单行版本更具惯用性的BASH?我只是想知道我是否错过了一个技巧。

我在Mac OS X Darwin命令行上运行,所以没有rename而没有prename :-(并且更喜欢纯粹的bash。

- 编辑

所以它不会在评论中迷失 - 蒂姆齐默尔曼的回答是作为一个班轮:

for d in */; do for f in $d*.png ; do mv "$f" "${f%%.png}_${d%%/}.png" ; done ; done

${f%%.png}_${d%%/}.png中进行第二次重命名是一个令我难过的伎俩。

3 个答案:

答案 0 :(得分:3)

您可以遍历循环中的所有子目录,并再次使用目录名称重命名文件:

#!/bin/bash

for d in */; do
    for f in "$d"*.png; do
        mv "$f" "${f%%.png}_${d%%/}.png"
    done
done

请注意,$d包含/,因此必须在重命名时将其删除。

答案 1 :(得分:1)

for c in black blue brown; do
  for f in $c/*.png ; do mv "$f" "${f%%.png}_$c.png" ; done
done

for f in {black,blue,brown}/*.png; do mv "$f" "${f%%.png}_${f%/*}.png" ; done

答案 2 :(得分:0)

如果您从未拥有*.png个文件的子目录,除了您想要移动的文件,您可以

for f in */*.png; do
    d=${f%/*}
    b=${f#*/}
    mv "$f" "${b%.png}_$d.png"
done

如果您不熟悉当前的命名惯例,您甚至可以

for f in */*.png; do
    mv "$f" "${f/\//_}"
done

如果你愿意,不难变成真正的单行。 (所以这基本上用下划线替换第一个斜杠。)