使用shell脚本根据其内容重命名许多文件

时间:2012-11-16 13:45:26

标签: shell word rename

我正在寻找一种在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

3 个答案:

答案 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以实现真正的
  • 将脚本放在xml目录之外以避免重命名脚本本身
  • 脚本可以找到包含供应商的任何字符串(即使在空格或制表符分隔的行中间)
  • 该脚本仅查找包含供应商
  • 模式的文件
  • 避免像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检查的文件数量将减少。