find: argumento ausente para '-exec'

1

quando estou tentando usar este comando

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|^\.''

está me jogando como

find: missing argument to '-exec'

Por favor, deixe-me saber se eu cometi algum erro nisso.

    
por user105264 31.03.2015 / 08:26

3 respostas

3

Você tem muitos shells fazendo algum processamento lá. Além disso, usar backticks é uma má idéia, especialmente quando haverá barras invertidas nelas. Você deve usar a sintaxe $(...) .

sudo -s inicia um shell para executar o comando, mas com sudo tentando escapar de alguns dos caracteres especiais para o shell. Você não quer usar isso.

ssh executa um shell no host remoto para interpretar a linha de comando que é feita da concatenação dos argumentos (com espaço intermediário).

Então, em:

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

sudo é executado:

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

( /bin/bash ou qualquer que seja o shell de login do usuário).

Observe como sudo escapou de . , + , } , mas não de barra invertida por nenhuma boa razão.

Então esse bash será executado:

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

ssh irá concatenar esses e executar no host remoto:

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

(onde $SHELL é o shell de login do usuário remoto desta vez).

Esse ; acima não é ignorado, portanto, interpretado como um separador de comando e não passado para find , e é por isso que find reclama que -exec não foi finalizado.

Aqui, você quer:

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|^\.'
)

(não que esse comando (especialmente o egrep part) faça muito sentido).

    
por 31.03.2015 / 10:51
0

Tente desta maneira:

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

(remova a barra invertida antes das chaves) Aspas duplas:

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|^\.''
    
por 31.03.2015 / 08:34
0

when I'm trying to use this command

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|^\.''

it is throwing me as

find: missing argument to '-exec'

Você deve usar isto:

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. Use "find [..]"
  2. Use 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. Use 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
    
por 31.03.2015 / 10:12