
リモート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
.see
find
の代わりにls
なぜいいえ解析ls
(および実行方法)?。リモートシステムで実行したいコマンドを引用符で囲むか(ただし、引用符を入れ子にすると問題が発生する可能性があることに注意してください)、ここに入れてください。
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が実行されないことを保証しました&&
。それ以外の場合は、まだ同期されていないファイルが削除されます。