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

使用shell脚本根据文件的内容重命名许多文件,shell,word,rename,Shell,Word,Rename,我正在寻找一种在linux shell脚本bash中执行以下操作的方法: 我得到了一系列以随机顺序命名的文件,并将其发送到服务器上的共享。 它们都包含文件中的某个标识符名称: e、 g fileabc123.xml包含单词PCVendor filedef456.xml包含单词PrinterVendor 为了以正确的方式处理这些文件,我需要找到一种方法/命令组合,将文件重命名为包含文件内单词的新文件名,以便: 需要将文件abc123.xml重命名为PCVendor-file123abc.xml f

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

我得到了一系列以随机顺序命名的文件,并将其发送到服务器上的共享。 它们都包含文件中的某个标识符名称: e、 g

fileabc123.xml包含单词PCVendor filedef456.xml包含单词PrinterVendor

为了以正确的方式处理这些文件,我需要找到一种方法/命令组合,将文件重命名为包含文件内单词的新文件名,以便:

需要将文件abc123.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

这是处理文件时的常见问题。最好的解决方案是将文件移动到新目录,并为其提供更好/正确的名称:

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等。这是处理文件时的常见问题。最好的解决方案是将文件移动到新目录,并为其提供更好/正确的名称:

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,以此类推

当测试正常时,从脚本中删除echo以真正执行它 将脚本放在xml目录之外,以避免重命名脚本本身 脚本可以找到任何包含供应商的字符串,即使在一行中,如果它被空格或制表符分隔开来。 脚本只查看包含模式供应商的文件 避免像ls*.xml这样的坏习惯;和cat文件| grep,请参见 注

当测试正常时,从脚本中删除echo以真正执行它 将脚本放在xml目录之外,以避免重命名脚本本身 脚本可以找到任何包含供应商的字符串,即使在一行中,如果它被空格或制表符分隔开来。 脚本只查看包含模式供应商的文件 避免像ls*.xml这样的坏习惯;和cat文件| grep,请参见 扩展的glob模式*Vendor-*.xml选择名称中没有Vendor-的所有xml文件。因此,grep检查的文件数量将在循环的每次迭代中减少


扩展的glob模式*Vendor-*.xml选择名称中没有Vendor-的所有xml文件。因此,grep检查的文件数量将在循环的每次迭代中减少。

太棒了,谢谢!我将尝试一下并感谢关于ls习惯的提示:-这里的感谢方式:如果答案有用,请投票,如果它符合你的需要,请接受它,这就是这个网站的工作方式。太棒了,谢谢!我将尝试一下,并感谢关于ls习惯的提示:-这里的感谢方式:如果答案有用,请投票,如果它符合你的需要,请接受它,这就是本网站的工作方式。
shopt -s extglob
for keyword in PCVendor PrinterVendor FruitVendor; do
    grep -l $keyword !(*Vendor-*).xml | xargs -I X mv X $keyword-X
done