Remover arquivos com correspondência apenas de alguns subdiretórios

3

Eu tenho um diretório com vários subdiretórios; em cada um desses, tenho alguns arquivos. Eu quero executar um grep apenas para alguns subdiretórios para encontrar os arquivos que correspondem à consulta e removê-los; algo como grep -rl --exclude-dir=dir1 --exclude-dir=dir2 HUMAN . | rm , mas prefiro não analisar o stdin de grep .

Acho que tenho que combinar find e rm , mas não sei como.

Além disso, parece que (pelo menos aqui no Cygwin), eu não posso fazer --exclude-dir = {dir1, dir2}, eu tenho que dividi-los. Este é um problema menor, mas alguém tem alguma idéia de por que isso não funciona?

    
por LinuxBlanket 14.03.2016 / 15:54

1 resposta

2
grep -rlZ --exclude-dir=dir1 --exclude-dir=dir2 HUMAN . |
  xargs -r0 rm -f

Se você quiser que find faça o diretório traversal:

find . -type d \( -name dir1 -o -name dir2 \) -prune -o \
  -type f -exec grep -lZ HUMAN {} + |
  xargs -r0 rm -f

Portável / normal, isso teria que ser:

find . -type d \( -name dir1 -o -name dir2 \) -prune -o \
  -type f -exec grep -q HUMAN {} \; -exec rm -f {} +

mas isso significa executar um grep por arquivo.

Para que o --exclude-dir={dir1,dir2} funcione, você precisa de um shell com suporte à expansão de chaves, como csh, tcsh, ksh, zsh, bash ou fish.

    
por 14.03.2016 / 16:57