2017-10-19 171 views
0

我一直在想办法重新命名嵌套文件夹中列出的文件名,并且遇到解决此问题的问题。作为一个测试,我已经能够削减我想要改变的名称的哪一部分,但不能想到如何将它放入一个变量并将它们连接在一起。文件格式看起来像这样。更改嵌套文件夹中文件的名称

XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 

我一直在测试这种格式,以削减我想要改变的部分,但我不确定这将是做到这一点的最佳方式。

echo XXX_XXXX_YYYYYYYYYY_100426095135-all.mp3 | awk -F_'{print $ 4}'| cut -c 1-6

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

我试图用这个命令用这个格式的'//g'重命名文件,但是这种格式不起作用,我只好重新命名''''文件名来删除空格。

因此该文件将开始为这个 XXX_XXXX_YYYYYYYYYY_100426151653-all.mp3 和这样结束 XXX_XXXX_YYYYYYYYYY_20100426-151653-all.mp3

+0

用四个空格前缀代码/数据。请看[编辑帮助](http://stackoverflow.com/editing-help)。 – Cyrus

回答

0

如何使用查找和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还排除es已被重命名并且看起来像WWW_XXXX_YYYYYYYYYYY_20AAAAAA-BBBBBB-all.mp3

W,X,Y,A,B可以是除下划线或破折号之外的任何字符。

所有找到的文件被重命名

注意:有方法,以缩小上述脚本,但这样做使得操作不太明显。

+0

我已经得到了程序运行,它的确如你所说的那样。那么有两个问题。 1.它一次只能执行一个文件。其次是嵌套文件播放不好。你有什么建议吗? – dreedy

0

这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' 

注:我来只是一个find命令和正则表达式的一部分。 perl one liner的积分转到perlmonks用户http://www.perlmonks.org/?node=823355

+0

如果我正确地看到这一个衬垫,它看起来就像它只适用于那个名称为_20100426的文件。我不认为这将适用于不同日期的嵌套文件。 – dreedy

相关问题