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