基本 Bash for 循环单行失败但不退出并且不产生输出

基本 Bash for 循环单行失败但不退出并且不产生输出

我在一个名为的文件中有一个很长的位置列表,file-locations其格式如下:

/mnt/q/fire/210407_NB552563_0007*/analysis/annotation/FIRID-5382*/*.gff 

我已尝试使用以下一种班轮将它们复制到我当前的位置:

for i in `cat file-locations`; do cp $i .; done

但这无济于事。它只是永远“运行”,并且如果没有 ctrl+C 就不会退出。

我不明白我做错了什么。有任何想法吗?

答案1

如果您的文件位置与您提供给我们的 glob 匹配,只需使用该 glob 来匹配文件集:

cp -v /mnt/q/fire/210407_NB552563_0007*/analysis/annotation/FIRID-5382*/*.gff .

不需要循环,当然也不需要路径文件,除非您的文件集实际上是与 glob 模式匹配的那些文件不相交的集合。

如果您确实需要读取文件列表,则需要假设所有文件名中都没有嵌入换行符 ( touch $'surprise\nname'),然后您可以按每一行读取文件名,

while IFS= read -r filename
do
    cp -v "$filename" .
done <file-locations

cp如果您想控制日志输出格式,请将此循环中的命令替换为这两行,

    printf "Copying %s: " "$filename" >&2
    cp "$filename" . && echo ok >&2

答案2

谢谢大家的回复。我从阅读它们中学到了很多东西。

解决方案本身非常简单,事实上,这些位置位于 NAS 上,尽管文件只有约 3mb,但它(事实证明)运行缓慢。

我最初尝试将“cp”更改为“echo”,以查看 glob 如何按照您的建议工作:

for i in `cat file-locations`; do echo $i .; done

这也失败了。所以我然后在一个随机文件上尝试了它的格式:

Help /
I /
Need/
Somebody/

这完美地表明了这句话是合乎逻辑的。然后我只添加了一个文件位置。大约花了 20 秒,但文件已复制。然后我添加了剩余的 30 个左右文件。看起来它什么也没做,但 20 分钟(非常长)后,所有文件都已成功复制。

再次感谢大家的意见:)

相关内容