如何删除文件名中的字符?

时间:2012-01-19 11:21:01

标签: sh

我在删除文件名中的字符时遇到了麻烦。

例如:

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml

1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml

这是我想要的输出:

1326847080_MUNDO-1.xml

1326836220_PLANETACNN-3.xml

3 个答案:

答案 0 :(得分:0)

for i in *.xml
do
    j=$(echo $i | sed -e s/-.*-/-/)
    echo mv $i $j
done

或一行:

for i in *.xml; do echo mv $i $(echo $i | sed -e s/-.*-/-/); done

删除echo以实际执行mv命令。

或者,没有sed,使用bash内置模式替换:

for i in *.xml; do echo mv $i ${i//-*-/-}; done

答案 1 :(得分:0)

使用Perl正则表达式

rename进行救援。此命令将显示将进行的移动;只需删除-n即可实际重命名文件:

$ rename -n 's/([^-]+)-.*-([^-]+)/$1-$2/' *.xml
1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml renamed as 1326836220_PLANETACNN-3.xml
1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml renamed as 1326847080_MUNDO-1.xml

正则表达式解释说:

  • 将第一个短划线保存到(但不包括)匹配1。
  • 将最后一个短划线后的部分保存为匹配2。
  • 将比赛1从比赛1开始替换为第2场比赛结束,比赛1,短划线和比赛2。

答案 2 :(得分:0)

抱歉迟到的回复,但我今天看到了:(。 我想你正在寻找以下

输入文件:: 猫> ABC

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml
1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml

代码:(它有点太基本,即使是我喜欢的)

    while read line
    do
    echo $line ;
    fname=`echo $line  | cut -d"-" -f1`;
    lfield=`echo $line |  sed -n 's/\-/ /gp' | wc -w`;
    lname=`echo $line | cut -d"-" -f${lfield}`;
    new_name="${fname}-${lname}";
    echo "new name is :: $new_name";
    done < abc ;

输出::

1326847080_MUNDO-Cinco-Cosas-Que-Aprendimos-Del-Debate-De-Los-Republicanos-1.xml
new name is :: 1326847080_MUNDO-1.xml

1326836220_PLANETACNN-Una-Granja-De-Mariposas-Ayuda-A-Reducir-La-Tala-De-Bosques-En-Tanzania-3.xml
new name is :: 1326836220_PLANETACNN-3.xml