Quero iterar sobre todas as pastas e suas subpastas e imprimir os nomes dos arquivos .TXT (nas subpastas) cuja primeira linha contém a string CYCLE DATE (pode haver espaços e/ou sublinhados entre CYCLE e DATE). Aqui está minha tentativa de resolver isso:
Em files_and_folders.sh eu digitei isto:
#!/bin/bash
find . -name '*.TXT' -exec awk 'NR == 1 && $0 ~ /CYCLE[_ ]+DATE/ { print FILENAME }'
Na linha de comando do bash eu digitei isto:
bash files_and_folders.sh
Isso produziu a seguinte mensagem de erro:
find: missing argument to -exec
Qual é a maneira correta de fazer isso?
Eu dividiria esse problema assim:
CYCLE DATE
Então,
Claro, em vez de
grep
você pode usarawk
para analisar sua linha, mas, francamente, isso é desnecessariamente complexo aqui. Sua expressão regular é muito simples (CYCLE, então "espaço" (pelo menos uma vez), então DATE), então um mecanismo de regex simples como grep pode fazer o trabalho.O problema com o seu
find
é que você não usa nem';'
nem'{}'
depois-exec
, entãofind
não consegue entender onde o comando que ele deveria executar está feito (ou onde ele deveria colocar o arquivo que encontrou ao fazer a invocação).Mas como isso nem é necessário
find
e pode ser feito completamente sem ele, eu pessoalmente diriafor file in GLOB; do … done
que é mais fácil de lembrar do quefind -name 'PATTERN' -exec Some complicated syntax '{}' ';'
.Da
find
página do manualObserve o ponto e vírgula final e que você deve colocar
{}
para indicar onde colocar o nome do arquivo, portanto, para revelar o caminho para os arquivos *.TXT onde a primeira linha corresponde a algum padrão que alguém pode fazerObserve que se você tiver arquivos grandes, você pode acelerar esse comando instruindo o GNU
AWK
a parar de processar as linhas após a primeira.