然后我使用这个脚本
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
答案 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