更改嵌套文件夹中的文件名
change name of file in nested folders
我一直在想办法重命名嵌套文件夹中列出的文件名,但在解决这个问题时遇到了问题。作为测试,我已经能够删除我想更改的名称的哪一部分,但想不出如何将其放入变量并将名称链接在一起。文件格式如下所示。
XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3
我一直在测试这种格式以删除我想要更改的部分,但我不确定这是否是最好的方法。
echo XXX_XXXX_YYYYYYYYYY_100426095135-all.mp3 |awk -F_ '{print $4}' |剪切-c 1-6
我想将名称中的 100426151653 更改为这种 20100426-151653 格式。
我曾尝试使用此格式的命令重命名文件 's/ //g' 但该格式不起作用我不得不求助于重命名“ ' '” 文件名以删除空白 space.
所以文件会这样开头
XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3
像这样结束
XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3
如何使用查找和 bash 函数
#!/bin/bash
modfn () {
suffix=
fn=$(basename )
path=$(dirname )
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 "[=10=]" ${suffix}' {} +
上面的 bash 脚本使用 find 在当前文件夹中搜索 WWW_XXXX_YYYYYYYYYY_AAAAAABBBBBB-all.mp3[ 等文件的内容=26=] 但不包括那些已经重命名并且看起来像 WWW_XXXX_YYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3.
W,X,Y,A,B 可以是下划线或破折号以外的任何字符。
所有找到的文件都已重命名
注意:有一些方法可以缩小上面的脚本,但这样做会使操作不那么明显。
这个 perl 单行代码可以完成这项工作:
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'
注意:我只带了一个查找命令和正则表达式部分。 perl one liner 归功于 http://www.perlmonks.org/?node=823355
的 perlmonks 用户
我一直在想办法重命名嵌套文件夹中列出的文件名,但在解决这个问题时遇到了问题。作为测试,我已经能够删除我想更改的名称的哪一部分,但想不出如何将其放入变量并将名称链接在一起。文件格式如下所示。
XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3
我一直在测试这种格式以删除我想要更改的部分,但我不确定这是否是最好的方法。
echo XXX_XXXX_YYYYYYYYYY_100426095135-all.mp3 |awk -F_ '{print $4}' |剪切-c 1-6
我想将名称中的 100426151653 更改为这种 20100426-151653 格式。
我曾尝试使用此格式的命令重命名文件 's/ //g' 但该格式不起作用我不得不求助于重命名“ ' '” 文件名以删除空白 space.
所以文件会这样开头 XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 像这样结束 XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3
如何使用查找和 bash 函数
#!/bin/bash
modfn () {
suffix=
fn=$(basename )
path=$(dirname )
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 "[=10=]" ${suffix}' {} +
上面的 bash 脚本使用 find 在当前文件夹中搜索 WWW_XXXX_YYYYYYYYYY_AAAAAABBBBBB-all.mp3[ 等文件的内容=26=] 但不包括那些已经重命名并且看起来像 WWW_XXXX_YYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3.
W,X,Y,A,B 可以是下划线或破折号以外的任何字符。
所有找到的文件都已重命名
注意:有一些方法可以缩小上面的脚本,但这样做会使操作不那么明显。
这个 perl 单行代码可以完成这项工作:
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'
注意:我只带了一个查找命令和正则表达式部分。 perl one liner 归功于 http://www.perlmonks.org/?node=823355
的 perlmonks 用户