Precisa de grep com letra específica e passar para outra pasta Linux

3

Eu preciso selecionar arquivos que contenham "Erro" ou "tráfego" em seus nomes, por exemplo,

abc_ERRor.csv
raError.csv
bsn_Error.csv
bbbctraffic.csv
ccc_traffic.csv
...

e mova-os para diretórios correspondentes, como Error_directory e traffic_directory de acordo com seus nomes.

Eu tentei isso, mas não funcionou

mv $(ls test_file | grep -l 'Error>' *) Error_directory

Como posso fazer isso a partir da linha de comando?

ls test_file | grep 'Error'
    
por narayan 10.09.2012 / 06:56

5 respostas

6

Analisar a saída de ls raramente é uma boa ideia devido à grande variedade de caracteres que podem ocorrer em nomes de arquivos. Uma solução melhor pode ser:

find ./test_file -iname "*error*" -print0 | xargs -0 -I {} mv {} Error_directory

Observe a opção -iname . Isso retornará correspondências insensíveis a maiúsculas e minúsculas, permitindo localizar e mover arquivos como:

abc_ERRor.csv
error_123.csv
ErRoR_77.csv

Se você não precisa que sua pesquisa seja insensível a maiúsculas e minúsculas, algo tão simples como isso deve ser suficiente:

mv test_file/*Error* Error_directory

Leitura adicional:

problema do separador xargs

armadilhas do bash

    
por 10.09.2012 / 08:25
1

Outra solução possível é:

#!/bin/sh

err_dir=~/errors
tra_dir=~/traffic

for f in *.csv; do
    case $f in
        *[Ee][Rr][Rr][Oo][Rr]*) mv -i $f $err_dir ;;
        *[Tt][Rr][Aa][Ff][Ii][Cc]*) mv -i $f $tra_dir ;;
    esac
done
    
por 14.09.2012 / 20:51
0

Você pode usar o find:

find test_file -type f -name "*Error*" -exec mv {} Error_directory/ \;

onde -type f indica que você está procurando por arquivos, -name declara que você está correspondendo ao padrão fornecido. exec executa o seguinte comando, com o {} ocupando o lugar dos arquivos que correspondem aos parâmetros fornecidos para localizar.

Se você quiser usar o bash e fazer algo mais do tipo que você tentou, um loop deve fazer o seguinte:

for f in 'ls test_file | grep 'Error'; do
  mv test_file/${f} Error_directory
done

Em ambos os exemplos, assumi que test_file é um diretório contendo os arquivos nos quais você está interessado.

    
por 10.09.2012 / 07:25
0
for fn in *.*; do for word in Error traffic; do echo "$fn" | grep -i "$word" && mkdir -p "$word"_directory && mv "$fn" "$word"_directory; done; done
    
por 14.09.2012 / 21:27
-1
ls | grep Error | xargs -I % mv % error-dir
    
por 10.09.2012 / 08:27