我有几个文件都以这一行开头:
CREATE PROCEDURE **CHANGING_NAME**
我希望能够提取程序的名称并使用它来重命名文件。第一行下面的每个文件都有内容。
以前有人做过这样的事吗?
由于
答案 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