O comando:
grep -rl "KORD" ./
pesquisa um diretório e retorna uma lista de arquivos contendo "KORD" no conteúdo do arquivo (não no título).
Users-MacBook-Air:myPhotorec user$ grep -rl "KORD" ./
.//output_apikey.txt
.//recup_dir.17/f13470392.txt
.//recup_dir.49/f45361992.txt
.//recup_dir.49/f45362424.txt
.//recup_dir.53/f48768408.txt
.//recup_dir.53/f49295480.txt
Existe um comando preferencial (xargs?) que aumenta o comando grep para imprimir a lista de arquivos de saída no console e copiar cada arquivo para um diretório: ./ORD ?
Suspeito que haja mais de uma maneira de 'esfolar um gato': estou ansioso para ver mais de uma solução
Solução XARGS de JOHN1024
O rótulo duplicado impede a postagem desta postagem modificada como resposta:
Tentar:
grep -rl --null --include '*.txt' KORD . | xargs -0r cp -t /path/to/dest
Como esse comando usa separação NUL, é seguro para todos os nomes de arquivo, incluindo aqueles com nomes difíceis que incluem espaços em branco, tabulações ou até novas linhas.
O acima requer GNU cp
. Para BSD/OSX, tente:
grep -rl --null --include '*.txt' KORD . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh
Como funciona:
grep
opções e argumentos-r
diz ao grep para pesquisar recursivamente na estrutura de diretórios. (No FreeBSD,-r
seguirá links simbólicos para diretórios. Isso não é verdade para o OS/X ou versões recentes do GNUgrep
.)--include '*.txt'
diz ao grep para retornar apenas arquivos cujos nomes correspondem ao glob*.txt
(incluindo os ocultos como.foo.txt
ou.txt
).-l
diz ao grep para retornar apenas os nomes dos arquivos correspondentes, não a correspondência em si.--null
diz ao grep para usar caracteres NUL para separar os nomes dos arquivos.LINUX/UNIX
diz ao grep para procurar apenas por arquivos cujo conteúdo inclua o regexLINUX/UNIX
.
pesquisa no diretório atual. Você pode omiti-lo em versões recentes do GNUgrep
, mas precisará passar uma--
opção de terminador paracp
se proteger contra nomes de arquivos que começam com-
.
xargs
opções e argumentos-0
diz ao xargs para esperar entrada separada por NUL.-r
diz ao xargs para não executar o comando a menos que pelo menos um arquivo seja encontrado. (Esta opção não é necessária em BSD ou OSX e não é compatível com OSX'sxargs
.)cp -t /path/to/dest
copia os diretórios para o diretório de destino. (-t
requer GNUcp
.)
Isso localizaria todos os arquivos regulares dentro ou abaixo do diretório atual.
grep -q 'KORD'
seria executado em cada arquivo e os arquivos que contêm linhas correspondentes seriam copiados para o diretório./ORD
.Se você tiver o GNU coreutils instalado, poderá usar o ligeiramente mais eficiente
Veja também: Entendendo a opção -exec de `find`