matching and reformatting poorly typed filenames

喜夏-厌秋 提交于 2019-12-13 08:14:01

问题


I have a large number of filenames that have been poorly written which I would like to clean up. The idea is to reformat the names so that they are more sensible.

Here are some examples:

01harpharm_3.1.aiff 1
01harpmute_2.6.aiff 1
01harpmute_2.6.aiff 2
01harpmute_2.6.aiff 3
01harpmute_2.6.aiff 4

If we look at the last example, the goal would be to rewrite

01harpmute_2.6.aiff 4 as 01harpmute_2.6.4.aiff.

I would like to use bash for this, either via a script (for loop), find, rename, or a combination thereof. Would anyone have opinions on how to best tackle this?


回答1:


Could you please try following once. Following will only print the rename commands on screen, you could run 1 command from it and if you are happy with results then you could run my 2nd code.

find . -type f -name "*.aiff*" -print0 | 
while IFS= read -r -d '' file
do
  echo "$file" | 
  awk '
    BEGIN{ s1="\"" }
    { val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
      print "mv " s1 val s1 OFS $1
    }'
done

OR in case you want to put condition and check if file name has space or not so put an additional condition in awk command it will skip files which are not having space in their names.

find . -type f -name "*.aiff*" -print0 | 
while IFS= read -r -d '' file
do
  echo "$file" | 
  awk '
    BEGIN{ s1="\"" }
    NF==2{ val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
      print "mv " s1 val s1 OFS $1
    }'
done


Run following only after you have tested above code successfully please.

find . -type f -name "*.aiff*" -print0 | 
while IFS= read -r -d '' file
do
  echo "$file" | 
  awk '
    BEGIN{ s1="\"" }
    { val=$0; sub(/^\.\//,""); sub(/\.aiff/,"."$2"&",$1)
      print "mv " s1 val s1 OFS $1
    }' | sh
done


来源:https://stackoverflow.com/questions/59004334/matching-and-reformatting-poorly-typed-filenames

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