Как запустить команду, сгенерированную из awk, с помощью printf? - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу создать сценарий оболочки, который будет переименовывать все файлы .txt из определенного каталога на удаленном сервере с помощью SFTP (сначала загрузит файлы, а затем переименует на удаленном сервере).Пожалуйста, проверьте следующую попытку:

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы пытаетесь переименовать файлы на сервере, но вы знаете, какие команды нужно запускать после загрузки файлов.

Простым вариантом будет запуск двух сессий 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
0 голосов
/ 27 февраля 2019

Привет новичок, пожалуйста, используйте это

sftp user@host <<EOF
cd $remoteDir
ls *.txt | awk '{printf "mv %s %s.done\n",$0,$0 ;}' | sh
exit
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...