【问题标题】:Search file name using a variable and replace with another variable使用变量搜索文件名并替换为另一个变量
【发布时间】:2014-02-16 14:27:32
【问题描述】:

我在一个变量 ($AUD_DATE) 中有搜索字符串,并在另一个变量 ($YEST_DATE) 中替换字符串。我需要使用 $AUD_DATE 在文件夹中搜索文件名,然后将其替换为 $YEST_DATE。

我尝试使用此链接来执行此操作,但它不适用于变量。 Find and replace filename recursively in a directory

shrivn1 $ AUD_DATE=140101
shrivn1 $ YEST_DATE=140124
shrivn1 $ ls *$AUD_DATE*
NULRL.PREM.DATA.CLRSFIFG.140101.dat  NULRL.PREM.DATA.CLRTVEH.140101.dat
shrivn1 $ ls *$AUD_DATE*.dat | awk '{a=$1; gsub("$AUD_DATE","$YEST_DATE");printf "mv \"%s\" \"%s\"\n", a, $1}'
mv "NULRL.PREM.DATA.CLRSFIFG.140101.dat" "NULRL.PREM.DATA.CLRSFIFG.140101.dat"
mv "NULRL.PREM.DATA.CLRTVEH.140101.dat" "NULRL.PREM.DATA.CLRTVEH.140101.dat"

我需要的实际输出是

mv "NULRL.PREM.DATA.CLRSFIFG.140101.dat" "NULRL.PREM.DATA.CLRSFIFG.140124.dat" 
mv "NULRL.PREM.DATA.CLRTVEH.140101.dat" "NULRL.PREM.DATA.CLRTVEH.140124.dat"

提前致谢

【问题讨论】:

  • 您链接的答案似乎有很多有用的例子。
  • 你的“实际输出”看起来不对。
  • @glennjackman : 更新了实际输出。

标签: shell unix sed awk


【解决方案1】:

方法 1

我通常使用 sed 创建 mv 命令,然后将输出通过管道传输到 sh。这种方法可以让我提前看到将要执行的命令。

例如:

$ AUD_DATE=140101
$ YEST_DATE=140124
$ ls -1tr | grep "${AUD_DATE}" | sed "s/\(.*\)/mv \1 \1_${YEST_DATE}"

一旦您对上一个命令的输出感到满意;重复它并将其输出到 sh,如下所示:

$ ls -1tr | grep "${AUD_DATE}" | sed "s/\(.*\)/mv \1 \1_${YEST_DATE}" | sh

方法 2

你可以使用 xargs 命令。

ls -1tr | grep ${AUD_DATE}" | xargs -I target_file mv target_file target_file${YEST_DATE}

【讨论】:

  • 谢谢@rishabh。但是第一种方法有一些解析错误,第二种方法没有提供所需的 o/p。它只是将 $YEST_DATE 附加到文件名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多