使用其内容重命名文件

时间:2014-08-25 16:11:58

标签: bash awk sed

我有几个文件都以这一行开头:

CREATE PROCEDURE **CHANGING_NAME**

我希望能够提取程序的名称并使用它来重命名文件。第一行下面的每个文件都有内容。

以前有人做过这样的事吗?

由于

5 个答案:

答案 0 :(得分:2)

非常谨慎并假装**CHANGING_NAME**格式正确:

for file in *.files; do mv -i -- "$file" "$(awk '{print $3; exit}' $file)" ; done

-i选项用于防止意外覆盖现有文件。

此版本适用于空格(以及除/之外的许多其他奇怪字符):

for file in *.files; do mv -i --  "$file" "$(sed -n '1s/^CREATE\ PROCEDURE\ \(.*\)$/\1/p' $file)"; done

答案 1 :(得分:2)

假设您在一个目录中拥有所有文件:

 #!/bin/bash

 for i in *.extension :
 do

   # Assuming 3rd column of the first line is the new name of the file
   # And **CHANGING_NAME** doesn't contain any space or meta characters

   newname=$(awk 'NR==1 && /PROCEDURE/ {print $3}' "$i")
   if [ "$newname" == "" ]; then
     echo "There is no PROCEDURE in the first line";
     echo "No new name for file $i";
   else
      mv "$i" "$newname"
   fi
 done

答案 2 :(得分:1)

您可以尝试下一个:

perl -lanE 'if($.==1&&/PROCEDURE/){close ARGV;say "$ARGV,$F[2]"}' files*

如果满意,请将其更改为

perl -lanE 'if($.==1&&/PROCEDURE/){close ARGV;rename $ARGV,$F[2]}' files*

答案 3 :(得分:1)

因为awk我从来都不是很好,我可能会建议:

#! /bin/bash
#

for i in *.extension
    do echo $i
    newname=$(head -1 "${i}" | cut -d ' ' -f2)
    mv -i "${i}" "${newname}"
done

这假设您要查找的所有文件都具有相同的扩展名。如果没有,并且您需要扩展名,则可以使用:

#! /bin/bash
#

for i in *
    do echo $i
    ext="${i##*.}"  
    newname=$(head -1 "${i}" | cut -d ' ' -f2)
    mv -i "${i}" "${newname}"."${ext}"
done

两者都假设所有文件都在一个目录中。

答案 4 :(得分:0)

mv myfile `sed '1 s/.*PROCEDURE\s*//' myfile`

(sed命令将删除单词proceding PROCEDURE左侧的文本,无论第一行上有多少空格并将其打印出来,使其执行到位,以便将其用作mv的文件名命令)

将它们全部移动并添加扩展名.ext:

  ls *.ext | xargs -I {} mv {} `sed '1 s/.*PROCEDURE\s*//' {}`.ext