1

我正在寻找一种在 linux shell 脚本(bash)中执行以下操作的方法:

我有一系列以随机顺序命名的文件并传送到服务器上的共享。它们都在文件中包含一个特定的标识符名称:例如

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 而不是将每个文件重命名为相应的单词。

在此先感谢您的帮助!

谢谢,伊夸特

4

3 回答 3

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从脚本中删除以真正做到这一点
  • 将脚本放在 xml 目录之外以避免重命名脚本本身
  • 该脚本可以找到任何包含 Vendor 的字符串(即使在一行中间,如果它由空格或制表符分隔)
  • 该脚本仅查看包含模式Vendor的文件
  • 避免不良习惯,例如ls *.xml;和cat file | grep,见http://porkmail.org/era/unix/award.html
于 2012-11-16T13:58:36.583 回答
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-”的!(*Vendor-*).xml所有 xml 文件。因此,grep 检查的文件数量将在循环的每次迭代中减少。

于 2012-11-16T16:43:15.767 回答
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.xmlPCVendor-PCVendor-file123abc.xml等。

于 2012-11-16T13:51:29.047 回答