使用 sed 根据文件中的内容批量重命名文件?

使用 sed 根据文件中的内容批量重命名文件?

我有一堆文件,其中都包含该模式SIZE1=%d。有没有办法找到该十进制并为每个文件名添加前缀%d_

此外,如果每个文件都包含SIZE1=%dSIZE2=%e我可以以某种方式为每个文件名添加前缀吗%d_%e_

我正在尝试了解我能做多少事情,sed因为我对此缺乏经验。

编辑:例如我有一个文件test_result.log.该文件中的某处有单独的行SIZE1=100SIZE2=150.我想重命名该文件100_150_test_result.log

答案1

使用 GNU sed,您应该能够通过两阶段 sed 调用来完成此操作。首先生成一些测试数据:

for i in {1..10}; do 
  if (( RANDOM%2 )); then 
    echo SIZE1=$((RANDOM%10)) > test$i.log
  else 
    echo SIZE1=$((RANDOM%10)) SIZE2=$((RANDOM%10)) > test$i.log
  fi
done

检查生成的数据:

head test*

输出:

==> test10.log <==
SIZE1=7

==> test1.log <==
SIZE1=5

==> test2.log <==
SIZE1=4 SIZE2=1

==> test3.log <==
SIZE1=9

==> test4.log <==
SIZE1=9 SIZE2=8

==> test5.log <==
SIZE1=6

==> test6.log <==
SIZE1=6

==> test7.log <==
SIZE1=5

==> test8.log <==
SIZE1=4 SIZE2=3

==> test9.log <==
SIZE1=3 SIZE2=8

为了首先找到所有包含 和 的文件SIZE1SIZE2我们使用短路模式,即b在成功匹配后分支 ( ) 到下一个文件:

提取参数.sed

/.*SIZE1=([0-9]+).*SIZE2=([0-9]+).*/ { F; s//\n\1_\2_\n/; p; b; }
/.*SIZE2=([0-9]+).*SIZE1=([0-9]+).*/ { F; s//\n\2_\1_\n/; p; b; }
/.*SIZE1=([0-9]+).*/                 { F; s//\n\1_\n/;    p; b; }

一旦我们有了参数和文件名,我们就构建所需的命令:

创建cmds.sed

N
s/([^\n]*)\n(.*)$/mv \1 \2\1/

像这样运行它:

sed -znsEf extract-params.sed test* | sed -Ef create-cmds.sed

输出:

mv test1.log 5_test1.log
mv test2.log 4_1_test2.log
mv test3.log 9_test3.log
mv test4.log 9_8_test4.log
mv test5.log 6_test5.log
mv test6.log 6_test6.log
mv test7.log 5_test7.log
mv test8.log 4_3_test8.log
mv test9.log 3_8_test9.log
mv test10.log 7_test10.log

现在可以将其通过管道传输到 shell 中,或者您可以使用 GNU sed 的/e模式修饰符。

相关内容