我在一个名为的文件中有一个很长的位置列表,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 分钟(非常长)后,所有文件都已成功复制。
再次感谢大家的意见:)