Problema quando tento passar parâmetros para encontrar o comando?

2

Parâmetro:

export exc_lst='! -path  "/var/app/s2/pnl/incoming/recondata/*.*"';

Quando tento usar os comandos below find:

find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

gera um erro: conjunção ausente

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

não exclui o caminho mencionado.

Quando eu passo o valor diretamente, ele funciona bem, por exemplo

find $FILE_DIR -name "*.*" ! -path  "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

Eu preciso resolver a variável que terá todos os arquivos a serem excluídos do comando find.

    
por suraj hebbar 16.09.2015 / 13:29

2 respostas

3

Você citou problemas.

Dica: coloque um echo na frente da linha de comando para ver o que realmente está expandindo. Ainda mais explícito, para mostrar exatamente onde cada argumento é separado, coloque python -c "import sys; print sys.argv[1:]" na frente da linha de comando.

python -c "import sys; print sys.argv[1:]" \
    find $FILE_DIR -name "*.*"  "${exc_lst}" -type f -mtime +20 -user sh79790 -ls

saídas:

['find', '-name', '*.*', '! -path  "/var/app/s2/pnl/incoming/recondata/*.*"', '-type', 'f', '-mtime', '+20', '-user', 'sh79790', '-ls']

Como você pode ver, ! -path "/var/app/s2/pnl/incoming/recondata/*.*" é fornecido como um único argumento grande com espaços e aspas dentro dele. Isso é o que você pede quando você cita ${exc_lst}" : não se expanda. find não reconhece isso. Ele precisa de ! , -path e o caminho como argumentos separados.

Agora:

echo find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

saídas:

find -name *.* ! -path "/var/app/s2/pnl/incoming/recondata/*.*" -type f -mtime +20 -user sh79790 -ls

Como você pode ver, existem caracteres de aspas duplas literais em torno do nome do caminho. Vai excluir um caminho que literalmente contenha essas citações, o que não ocorrerá.

Tente definir exc_lst sem as citações:

export exc_lst='! -path  /var/app/s2/pnl/incoming/recondata/*.*'

e, em seguida, usando seu segundo formulário:

find $FILE_DIR -name "*.*"  ${exc_lst} -type f -mtime +20 -user sh79790 -ls

Felizmente, o caminho a excluir não contém espaços. Se assim fosse, você teria muito mais dificuldade em realizar isso.

Nota: Toda a minha amostra de amostra está faltando o primeiro argumento para find porque $FILE_DIR não está definido no meu shell (você não especificou seu valor), mas se ele estivesse definido, ele estaria lá.

    
por 16.09.2015 / 13:48
0

Você não pode, ao mesmo tempo, definir exec_lst da maneira como fez e impedir a expansão do nome do arquivo pelo shell.

-path e seu argumento deve estar em argumentos separados

Então, eu recomendo usar '-path * diretamente na linha de comando e colocar o caminho apenas na variável shell.

Outra maneira pode ser omitir o "em torno de $ [exed_lst] e adicionar uma ou duas barras invertidas antes de cada estrela na atribuição da variável.

    
por 16.09.2015 / 13:40