我目前正在使用一堆单行来重命名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
中进行第二次重命名是一个令我难过的伎俩。
答案 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
如果你愿意,不难变成真正的单行。 (所以这基本上用下划线替换第一个斜杠。)