【问题标题】:How to run the command generated from awk with printf?如何使用 printf 运行从 awk 生成的命令?
【发布时间】:2019-02-27 11:16:51
【问题描述】:

我想创建一个 shell 脚本,它将使用 SFTP 重命名远程服务器中特定目录中的所有 .txt 文件(将首先下载文件,然后在远程服务器中重命名)。请检查以下尝试:

sftp user@host <<EOF
cd $remoteDir
get *.txt
ls *.txt | awk '{printf "rename %s %s.done\n",$0,$0 ;}' 
exit
EOF

从语句ls *.txt | awk '{printf "rename %s %s.done\n",$0,$0 ;}' 会生成并打印出rename 命令列表,我的问题是,如何运行从awk printf 生成的这些命令?

【问题讨论】:

  • 不清楚,很高兴您已经展示了您正在尝试的内容,但您错过了告诉我们您的问题的完整情况的部分,请添加更多详细信息并让我们知道。
  • @RavinderSingh13 我已经编辑了帖子,如果您需要更多信息,请告诉我。
  • 您要重命名服务器上的文件,还是您下载的副本?
  • @jhnc 重命名服务器上的文件

标签: shell awk


【解决方案1】:

您正在尝试重命名服务器上的文件,但您只知道下载文件后要运行哪些命令。

简单的选择是运行两个 sftp 会话。第一个下载文件。然后生成重命名命令。然后运行第二个 sftp 会话。

但是可以在一个会话中同时完成这两项操作:

#!/bin/bash

(
    # clean up from any previous run
    rmdir -f syncpoint

    # echo commands are fed into the sftp session
    # be careful with quoting to avoid local shell expansion
    echo 'cd remoteDir'
    echo 'get *.txt'
    echo '!mkdir syncpoint'

    # wait for sftp to create the syncpoint folder
    while [ ! -d syncpoint ]; do sleep 5; done

    # the files have been downloaded
    # now we can generate the rename commands
    for f in *.txt; do
        # @Q is a bash (v4.4+) way to quote special characters
        echo "rename ${f@Q} ${f@Q}.done"
        # if not available, single-quoting may be enough
        #echo "rename '$f' '$f'.done"
    done

    # clean up
    rmdir syncpoint

) | sftp user@host

【讨论】:

  • +1 表示聪明,但“可以做到”并不意味着“应该做到”。让您在子进程中运行sftp 的工具会更简单、更健壮。我的选择是 Python,但我确信它可以使用任何现代脚本语言来完成。
  • @tripleee 我可以相信如果您进行错误处理,它会更强大。我不知道 python,但查看 paramiko 文档,似乎一个人最终可能会得到与此类似的逻辑,但只是有更多的样板。如果问题更复杂,而不是更简单,可能值得... :-)
  • 有一个单独的 pysftp 库,我相信它应该可以相当简洁地完成。
  • 是的,虽然get *.txt 看起来并不完全是微不足道的:stackoverflow.com/q/36329931/10971581
  • 也许还提到${f@Q} 是 Bash v4.4+ 功能。
【解决方案2】:

你好新手请使用这个

sftp user@host <<EOF
cd $remoteDir
ls *.txt | awk '{printf "mv %s %s.done\n",$0,$0 ;}' | sh
exit
EOF

【讨论】:

  • 对不起,我错过了重命名 .. 应该是 mv 再试一次
  • 不行,mv在sftp中不起作用,sftp需要使用rename
  • 远程主机是哪个发行版??
  • 我不确定 sftp 是否允许您将 ls 像这样通过管道传输到 awk。可能EOF 应该在ls 行之前(并且缺少get 行)。
  • 当然可以,我测试过但他没有说远程主机是哪个发行版。
猜你喜欢
  • 1970-01-01
  • 2022-08-13
  • 2012-04-02
  • 2014-07-29
  • 2011-06-03
  • 2014-03-22
  • 1970-01-01
  • 2017-08-28
  • 2011-06-30
相关资源
最近更新 更多