更改嵌套文件夹中的文件名

时间:2017-10-19 16:57:23

标签: linux bash awk rename file-rename

我一直在想办法重命名嵌套文件夹中列出的文件名,并且遇到解决此问题的问题。作为一个测试,我已经能够删除我想改变的名称的哪一部分,但却想不出如何将其放入变量并将名称链接在一起。文件格式如下所示。

XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3

我一直在测试这种格式以削减我希望改变的部分,但我不确定这将是最好的方式。

回显XXX_XXXX_YYYYYYYYYY_100426095135-all.mp3 | awk -F_'{print $ 4}'|切-c 1-6

我想将名称中的100426151653更改为此20100426-151653格式。

我尝试使用此命令使用此格式重命名文件's / // g'但该格式不起作用我不得不求助于重命名''''文件名以删除空格。< / p>

所以文件会以此开头     XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 并以此结束     XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3

2 个答案:

答案 0 :(得分:0)

如何使用find和bash函数

#!/bin/bash

modfn () {
  suffix=$2
  fn=$(basename $1)
  path=$(dirname $1)

  fld1=$(echo $fn | cut -d '_' -f1)
  fld2=$(echo $fn | cut -d '_' -f2)
  fld3=$(echo $fn | cut -d '_' -f3)
  fld4=$(echo $fn | cut -d '_' -f4)
  fld5=${fld4%$suffix}
  l5=${#fld5}
  fld6=${fld5:0:$(($l5 - 6))}
  fld7=${fld5:$(($l5 - 6)):6}

  newfn="${fld1}_${fld2}_${fld3}_20${fld6}-${fld7}${suffix}"

  echo "moving ${path}/${fn} to ${path}/${newfn}"
  mv ${path}/${fn} ${path}/${newfn}"
}


export -f modfn

suffix="-all.mp3"
export suffix

find . -type f -name "*${suffix}" ! -name "*-*${suffix}" -exec bash -c 'modfn "$0" ${suffix}' {} +

上面的bash脚本使用find来搜索当前文件夹,它的内容是 WWW_XXXX_YYYYYYYYYY_AAAAAABBBBBB-all.mp3 等文件,但不包括那些已经重命名的文件的 WWW_XXXX_YYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3

W,X,Y,A,B可以是下划线或短划线以外的任何字符。

重命名所有找到的文件

注意:有一些方法可以缩小上面的脚本,但这样做会使操作不那么明显。

答案 1 :(得分:0)

perl one-liner完成了这项工作:

find . -name "XXX_XXXX_YYYYYYYYYY_*-all.mp3" -printf '%P\n' 2>/dev/null | perl -nle '$o=$_; s/_[0-9]{6}/_20100426-/; $n=$_; rename($o,$n)if!-e$n'

注意:我只使用了find命令和regex部分。 perl one liner的功劳归于http://www.perlmonks.org/?node=823355

的perlmonks用户