我正在寻找一种在linux shell脚本(bash)中执行以下操作的方法:
我有一系列按随机顺序命名的文件并传送到服务器上的共享。 它们都在文件中包含某个标识符名称: e.g。
fileabc123.xml
包含单词PCVendor
filedef456.xml
包含PrinterVendor
为了以正确的方式处理这些文件,我需要找到一种方法/命令组合来将文件重命名为包含文件内部单词的新文件名,所以:
fileabc123.xml
需要重命名为PCVendor-file123abc.xml
filedef456.xml
需要重命名为PrinterVendor-file456def.xml
这需要从shell脚本中自动完成。
我在看以下内容:
for i in `ls *.xml`;
do
cat *.xml | grep "PCVendor"
mv $i PCVendor-$i
done
但我知道这会将所有可用文件重命名为PCVendor- $ i 将每个文件重命名为相应的单词。
提前感谢您的帮助!
谢谢, etquart
答案 0 :(得分:2)
for i in $(grep -l Vendor *.xml); do
echo mv "$i" "$(
awk '/Vendor/{
for (i=0; i<=NF; i++) {
if ($i ~ "Vendor$"){print $i; exit}
}
}' "$i")-$i"
done
注意强>
echo
以实现真正的ls *.xml
这样的坏习惯;和cat file | grep
,请参阅http://porkmail.org/era/unix/award.html 答案 1 :(得分:1)
这是处理文件时的常见问题。最好的解决方案是将文件移动到新目录,并为其提供更好/更正的名称:
PCVendorDir=../PCVendor
mkdir -p "$PCVendorDir"
for i in *.xml ; do
if grep -q PCVendor $i ; then
mv "$i" "$PCVendorDir/PCVendor-$i"
fi
done
如果您不将文件移至其他文件夹,则下一次运行该脚本会将PCVendor-file123abc.xml
重命名为PCVendor-PCVendor-file123abc.xml
等。
答案 2 :(得分:1)
shopt -s extglob
for keyword in PCVendor PrinterVendor FruitVendor; do
grep -l $keyword !(*Vendor-*).xml | xargs -I X mv X $keyword-X
done
扩展的glob模式!(*Vendor-*).xml
选择名称中没有“Vendor-”的所有xml文件。因此,在循环的每次迭代中,grep检查的文件数量将减少。