リモートLinuxシステムにログインし、コマンドを実行します。

リモートLinuxシステムにログインし、コマンドを実行します。

リモートLinuxシステムで実行されているディレクトリから最新の2つのファイルを除くすべてのファイルを削除するには、次のようにします。

cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --

リモートLinuxシステムにログインした後、これらのコマンドを手動で実行しますが、ログインとこ​​れらのコマンドの実行を1つのコマンドにまとめたいと思います。

ログイン場所を使用して同様の操作を実行し、scpファイルをローカルコンピュータのdirにscpしました/local/data

scp -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data

上記のログインとコマンドと同様の操作を実行する方法はありますか?

cd /data
ls -1tr | head -n -2 | xargs -d '\n' rm -f --

ローカルコンピュータのリモートコンピュータで単一のコマンドを実行しますか?

答え1

他のポスターに同意します。この種の構文解析を使用してはいけませんが、現在実行されている操作には機能するため、コマンドで-dスイッチを使用してフルディレクトリパスを取得することはlsできませんか?ls

さらに作業を行わない限り、作業ディレクトリを変更する理由はありません。このワイルドカードを追加する必要があります。

ssh user@host "ls -d1tr /data/* | head -n -2 | xargs -d '\n' rm -f --"

答え2

  1. .seefindの代わりにlsなぜいいえ解析ls(および実行方法)?

  2. リモートシステムで実行したいコマンドを引用符で囲むか(ただし、引用符を入れ子にすると問題が発生する可能性があることに注意してください)、ここに入れてください。

findたとえば、、、sortおよびhead次のGNUバージョンを使用してくださいcut

ssh -i LightsailDefaultKey-eu-west-2.pem [email protected] \
  'find /data/ -maxdepth 1 -type f -printf "%Ts\t%p\0" | sort -z -nr | 
     head -z -n 2 | cut -z -f2 | xargs -0r rm -f --'

printf形式の文字列の周りに一重引用符ではなく二重引用符を使用しました。これは、単一引用符で囲まれて実行されるコマンドパイプライン全体をラップするためですssh。を使用することもできますが-printf '\''%Cs\t%p\0'\''(変数補間などのリスクがないため)二重引用符を使用する方が簡単です。

この-printf形式は、ファイルの最後の修正タイムスタンプ(エポック以降の秒、数字で簡単にソート可能sort -z -rn)、タブ文字、およびファイルのフルパス名を印刷します。タイムスタンプとタブを削除し、cutファイル名のみxargs

別のオプションは、次のものを使用することです。トレドック:

ssh -i LightsailDefaultKey-eu-west-2.pem [email protected] <<-'EOF'
    find /data/ -maxdepth 1 -type f -printf '%Ts\t%p\0' | sort -z -nr | 
      head -z -n 2 | cut -z -f2 | xargs -0r rm -f --
EOF

答え3

私が知っている限り、scp同じ実行でコマンドとシェルコマンドを組み合わせることはできません。あなたができる最高のことは:

    scp -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data && \
    ssh -i LightsailDefaultKey-eu-west-2.pem -r [email protected]:/data/ /local/data bash -c "cd /data; ls -1tr | head -n -2 | xargs -d '\n' rm -f --"

私はscpが成功しないとsshが実行されないことを保証しました&&。それ以外の場合は、まだ同期されていないファイルが削除されます。

関連情報