【问题标题】:run a command with a file pattern运行带有文件模式的命令
【发布时间】:2021-11-25 01:38:53
【问题描述】:

我有这个文件 模式.txt

a
b
c
d
e

我想像这样为每个模式运行一个特定的命令:

scp username@hostname:/name/a
scp username@hostname:/name/b
scp username@hostname:/name/c
scp username@hostname:/name/d
scp username@hostname:/name/e

我尝试使用这样的 for 循环:

#!/bin/bash
cat pattern.txt
for i in $pattern.txt
do
scp username@hostname:/name/$i
done

但我没有工作

【问题讨论】:

    标签: linux bash loops for-loop script


    【解决方案1】:

    两种典型的方法是:

    while read i; do 
    scp username@hostname:/name/"$i"
    done < patterns.txt
    

    sed 's#^#username@hostname:/name/#' patterns.txt | xargs -L 1 scp 
    

    请注意,我希望这两个都失败,因为 scp 至少需要 2 个参数。您希望第二个参数如何适合您运行的命令将改变您使用 xargs 的方式。

    例如,如果你想执行scp username@hostname:/name/a .,你可以这样做:

    sed 's#^#username@hostname:/name/#' patterns.txt |
    xargs -L 1 -J % scp % . 
    

    你也可以for i in $(cat patterns.txt),但你不应该这样做。

    【讨论】:

    • 为什么不说服xargs 实现您对sed 所做的更改? xargs -L 1 -J % scp 'username@hostname:/name/%' . &lt; patterns.txt 应该可以解决问题,不是吗?
    • @JonathanLeffler 应该,但是我的macos上的xargs不会扩展%,除非它自己出现。如果不求助于sh -c ...,我找不到一种干净的方法来让它进行扩展
    • 来自 BSD 手册页:The replstr must show up as a distinct argument to xargs. It will not be recognized if, for instance, it is in the middle of a quoted string.
    • 呃——xargs 中又出现了一个错误。原则上,它非常有用。在实践中,它通常没有用。例如,它坚持至少运行一次命令经常让我烦恼(GNU xargs-r 阻止它);它解析空格而不是行也是如此。好的;如您所知,我没有检查它。当它到达那个点时,我通常让xargs 运行一个行为正常的shell 脚本,使用sh script.shsh -c '…script iterating over "$@"…' name(其中名称为脚本提供$0,并确保所有文件都得到处理)。
    • @JonathanLeffler 同意。我发现xargs 经常令人惊讶地缺乏。但是sh -c 总是作为一种解决方法出现!
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多