如何用xargs curl读取子目录URLs.txt并在对应子目录下载文件
问题原因
你使用管道cd ... | ...的方式执行命令时,管道会创建子shell来运行cd命令。子shell里的目录切换不会影响父shell的工作目录,后续的ls、curl等命令依然在父目录中执行,所以下载的文件都会保存到父目录里。
解决方法
方法1:用子shell包裹目录切换与下载命令
把cd和后续命令放在括号()内,这样会在独立的子shell中完成目录切换和下载操作,不会干扰父shell的工作目录:
for i in ./*_assay; do (cd "$i" && ls URL* | xargs -L 1 -d '\n' zcat | xargs -L 1 curl -O -J -L) done
- 加入
&&是为了确保只有cd成功进入目标目录时,才执行后续的下载命令,避免目录不存在时无效执行。
方法2:用pushd/popd切换目录
pushd会进入目标目录并记录原目录,popd则会回到之前的目录,适合需要明确切换目录场景:
for i in ./*_assay; do pushd "$i" >/dev/null ls URL* | xargs -L 1 -d '\n' zcat | xargs -L 1 curl -O -J -L popd >/dev/null done
>/dev/null用于屏蔽pushd/popd的默认输出,让命令行输出更简洁。
方法3:用curl的--output-dir参数(需curl 7.73.0+)
如果你的curl版本在7.73.0及以上,可以直接指定下载文件的保存目录,无需切换目录:
for i in ./*_assay; do ls "$i"/URL* | xargs -L 1 -d '\n' zcat | xargs -L 1 curl -O -J -L --output-dir "$i" done
- 此方法无需切换目录,但要注意版本兼容性,老版本curl不支持
--output-dir参数。
内容的提问来源于stack exchange,提问作者Steven James
相关产品推荐
相关产品推荐

