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