所以我正在努力解决一个问题,我不能真正弄清楚它。我有一个SH脚本,它(理论上)应该打开一个TXT文件,遍历内容(几行,每行只有一个单词),并以名称作为参数执行查找命令,其中名称是从TXT文件中提取的单词。我写了下面的代码,当然不能正常工作,我真的不明白为什么它不能工作。
#!/bin/bash
home=$HOME
to_process=$home/to_process
solved=$home/solved
while IFS= read -r content_file
do
echo $content_file
echo $to_process
echo "___________________________________"
for i in $(find $to_process -name $content_file);do
echo $i
#cp $i $solved;
done
done < list_of_files.txt
echo "__Problem solved__"
echo工作得很好,它显示了我需要的确切值。当进入FOR时,我没有任何结果。可以看到,在单词和前面的路径之间,我们有一个空行,其中的值应该是"$f"
'*WORD1_*'
/home/devserv1/to_process
___________________________________
'*WORD2_*'
/home/devserv1/to_process
___________________________________
'*WORD3_*'
/home/devserv1/to_process
___________________________________
'*WORD4_*'
/home/devserv1/to_process
__Problem solved__
可能是因为在我的TXT文件中,我用引号和*保存了名称?我一直不知道文件是如何命名的,所以此后我只知道前4-5个字符。此后,我将它们保存为"* WORD4_ *"(在文件中,'和*与文本之间没有空格)在我的TXT文件中,以便在我的FIND命令中更快地使用它。如果是这样,我该如何解决这个问题?
抽象一点。试试globstar
.
cat list_of_files.txt
WORD1_
WORD2_
WORD3_
WORD4_
我不太喜欢read
。
就我个人而言,我更喜欢
(shopt -s globstar; cp "$HOME"/to_process/**/*WORD[1234]_* "$HOME/solved/")
但是我猜你的清单并没有那么简单。如果它至少没有被嵌入的换行符所困扰,或者更糟,也许是这样?
#!/bin/bash
shopt -s globstar
mapfile -t keys < list_of_files.txt
set -x
for k in "${keys[@]}"; do cp "$HOME"/to_process/**/*"$k"* "$HOME/solved/"; done
(这仍然适用于嵌入空格等)
如果你在这些字符串中有任何真正奇怪的,那么一定要检查mapfile
文档。