検索: '-exec'引数がありません

検索: '-exec'引数がありません

このコマンドを使用しようとすると

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

それは私を投げる

find: missing argument to `-exec'

この過程で私が間違えたことがあれば教えてください。

答え1

そこでいくつかの処理を実行するシェルが多すぎます。また、バックティックを使用するのは悪い考えです。特にバックティックが含まれている場合はさらにそうです。代わりに構文を使用する必要があります$(...)

sudo -sコマンドを実行するには、シェルを起動してください。ただし、sudoシェルの特殊文字の一部をエスケープしてみてください。あなたはそれを使用したくありません。

ssh接続された引数(引数の間にスペースを含む)で構成されるコマンドラインを解釈するために、リモートホストでシェルを実行します。

だから:

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \;`

sudo走る:

"/bin/bash", ["/bin/bash", "-c", 
  "ssh daill_scp\\@files.dc1.responsys.net find \\.  -maxdepth 1 -type f -mtime \\+14 -exec ls -lh \\{\\} \\;"]

/bin/bashまたはユーザーのログインシェルは何でも)。

、 はどのようにsudoエスケープされますが、バックスラッシュは特別な理由なくエスケープされません。.+}

これでb​​ashが実行されます。

"/usr/bin/ssh", ["ssh", "[email protected]", "find", ".", "-maxdepth", "1", "-type", "f", "-mtime", "+14", "-exec", "ls", "-lh", "{}", ";"]

sshこれを接続し、リモートホストで実行します。

"$SHELL", ["$SHELL", "-c", "find . -maxdepth 1 -type f -mtime + 14 -exec ls -lh {} ;"]

$SHELL今回はリモートユーザーのログインシェルはどこにありますか?)

上記は;エスケープされていないため、コマンド区切り文字として解釈され、コマンド区切り文字に渡されないため、苦情は終了しませんfindfind-exec

希望する場所は次のとおりです。

var1=$(
  sudo -u psoadmin -H ssh [email protected] '
    find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \;' |
    awk '{print $5, $9}' |
    egrep -v '^./upload|^./download|^./archive|^\.'
)

(このコマンド(特にそのegrep部分)に意味があるわけではありません。)

答え2

次の方法を試してください。

...-exec ls -lh {} \;...

(中括弧の前のバックスラッシュを削除)二重引用符:

var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  {} \; "| awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

答え3

このコマンドを使用しようとすると

var1=`sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  \{} \; | awk '{print $5, $9}'|egrep -v '^./upload|^./download|^./archive|^\.'`

これが私を作る

find: missing argument to `-exec'

以下を使用する必要があります。

var1=`sudo -u psoadmin -H -s ssh [email protected] "find . -maxdepth 1 -type f -mtime +14 -exec ls -lh  {} \;  | tr -s [:space:] | cut -d ' ' -f 5,9 | egrep -v '^./upload|^./download|^./archive|^\.'"`
  1. 使用"find [..]"
  2. 使用tr

    -s, --squeeze-repeats
          replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character
    
  3. 使用cut

    -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter
    -f, --fields=LIST
          select only these fields;  also print any line that contains no delimiter character, unless the -s option is specified
    

関連情報