find、printf、sshの奇妙な動作

find、printf、sshの奇妙な動作

したがって、これはうまくいきます。

find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n" > /dir/output.txt

しかし、そうではありません:

ssh -o StrictHostKeyChecking=no "servername" find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n" > /dir/output.txt

sshコマンドを実行すると、次のエラーが発生します。

bash: %TY-%Tm-%Td: command not found
bash: %TH:%TM: command not found
bash: %s: command not found
bash: %u: command not found
bash: %Un: command not found

このコマンドの形式を再指定するために欠落している特定の項目はありますか?

答え1

このコマンドの形式を再指定するために欠落している特定の項目はありますか?

はい。 SSH経由でコマンドを実行すると、1レベルの参照が失われます。だからこれ:

find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n"

になる:

find /dir/ -type f -printf %p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n

これは一緒にパイプで接続される一連の|シェルコマンドです()。内容全体を一重引用符で囲むことでこの問題を解決できます。

ssh -o StrictHostKeyChecking=no "servername" 'find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n"' > /dir/output.txt

あるいは、bashにstdinとしてスクリプトを渡します。

ssh -o StrictHostKeyChecking=no "servername" bash <<EOF > /dir/output.txt
find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n"
EOF

答え2

はがきの答えは、次のように元のコマンドの接頭辞と接尾辞を一重引用符で囲むことです。

ssh -o StrictHostKeyChecking=no "servername" 'find /dir/ -type f -printf "%p|%TY-%Tm-%Td|%TH:%TM|%s|%u|%U\n" > /dir/output.txt'

関連情報