从variable1中查找占位符{}并将其放入variable2

时间:2014-09-13 17:23:24

标签: linux bash unix sed

然后我使用这个脚本

for line in "`cat fromDirs.txt`"; 
do 
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/ \;; 
done

我在文件夹/ tmp中只有文件名从它们被复制的位置,但是我需要这个文件名包含它们来自哪里的完整路径,我很厌烦尝试与sed战斗,请帮助

所以我需要取每个{}值并用斜号( - )

替换斜杠(/)

我尝试了许多变体,但没有什么好处,这段代码也不起作用

for line in "`cat fromDirs.txt`"; 
do 
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/$(sed "s/\//-/g" <<< {}) \;;
done

文件fromDirs.txt包含

/home/orders/
/etc/bin/school/

没有输出,只是什么都没有,也许是因为我使用sh?我根本没有在系统上打击

我认为问题在于sed,因为它将占位符{}视为文件而不是字符串,所以如果{} = /home/orders/good.php则sed打开此文件并将所有斜杠更改为减号,但是我需要仅在文件名中进行更改,以便/home/orders/good.php -> -home-orders-good.php然后将cp更改为/tmp/-home-orders-good.php

1 个答案:

答案 0 :(得分:1)

我猜你得到问题,因为你引用了文件的输出 尝试更改:

for line in "`cat fromDirs.txt`";

为:

for line in `cat fromDirs.txt`; 

或更好(删除过时和过时的抽动):

for line in $(cat fromDirs.txt); 

最好(在阅读文件时使用):

#!/bin/bash
while read line
do
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/$(sed "s/\//-/g" <<< {}) \;;
done < fromDirs.txt