rename file in bourne shell

跟風遠走 提交于 2019-12-13 04:09:10

问题


I am trying to write a bourne-shell script that takes a directory as a parameter and look for images named ixxx.a and rename them to ixxx_a.img where "xxx means the extension number for exemple image files would be named i001.a , i002.a ,i003.a ...) here what I tried

mv $1/f[0-9][0-9][0-9].a $1/f[0-9][0-9][0-9]_a.img

but it says that the DEST is not a directory. Any help would be much appreciated. Thanks.


回答1:


for i in $1/f[0-9][0-9][0-9].a; do
  mv $i ${i%.a}_a.img
done

However, this does not consider blank spaces in the file/folder names. In this case you'd have to use while so you get one file name per line (see below for bonus). There are probably dozens of other ways, including rename.

find $1 -maxdepth 1 -type f -name "f[0-9][0-9][0-9].a"|while read i; do
  mv "$i" "${i%.a}_a.img"
done

Edit: Perhaps I should explain what I did there. It's called string substitution and the main use cases are these for a variable var:

# Get first two characters
${var:0:2}
# Remove shortest rear-anchored pattern - this one would give the directory name of a file, for example
${var%/*}
# Remove longest rear-anchored pattern
${var%%/*}
# Remove shortest front-anchored pattern - this  in particular removes a leading slash
${var#/}
# Remove longest front-anchored pattern - this would remove all but the base name of a file given its path
# Replace a by b
${var//a/b}
${var##*/}

For more see the man page.



来源:https://stackoverflow.com/questions/9527722/rename-file-in-bourne-shell

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!