find Comando junto com grep e mv

0

Eu tenho muitos arquivos em uma pasta SRC. Eu gostaria de mover todos os arquivos que seguem um padrão específico desta pasta SRC para outra pasta DST junto com renomear o arquivo com uma extensão necessária.

Parâmetros da amostra

Diretório SRC /Vinodh

Os arquivos na pasta /Vinodh são TEST01 , TEST02 , TEST03 , TEST04

TEST02 & TEST03 contém a palavra WORLD

Diretório DST /TEST

Eu quero mover o TEST02 & TEST03 arquivos para a pasta /TEST como TEST02.txt e TEST03.txt

Eu vou estar digitando o comando como

cd /Vinodh
grep -l 'WORLD' *TEST*
mv TEST02 /TEST
mv TEST03 /TEST
cd /TEST
mv TEST02 TEST02.txt
mv TEST03 TEST03.txt

Eu gostaria de combinar tudo isso com uma única instrução de linha ou ter um arquivo em lote que copie todos os arquivos em uma única foto.

    
por Vinodh Pullot Chandrasekharan 13.12.2017 / 13:03

5 respostas

1

Com ferramentas GNU:

grep -D skip -d skip -lZ WORD /Vinodh/*TEST* | xargs -r0 mv -vt /TEST

Observe que, se alguns desses arquivos forem links simbólicos, movê-los poderá quebrar os links.

O GNU grep pode ignorar dispositivos / fifos com -D skip e diretórios com -d skip , mas não há opção para pular links simbólicos. Você precisaria de um shell onde os globs pudessem especificar tipos de arquivos como zsh :

grep -lZ WORD /Vinodh/*TEST*(.) | xargs -r0 mv -vt /TEST

Só procuraria em arquivos regulares .

Uma alternativa é usar find :

LC_ALL=C find /Vinodh/. ! -name . -prune \
  ! -name '.*' -type f -name '*TEST*' -exec grep -lZ WORD {} + |
  xargs -r0 mv -t /TEST

E a variante POSIX, se você não tiver ferramentas GNU:

LC_ALL=C find /Vinodh/. ! -name . -prune \
  ! -name '.*' -type f -name '*TEST*' -exec grep -q {} \; \
  -exec mv {} /TEST/ \;
    
por 13.12.2017 / 13:37
0

Faça um loop sobre os arquivos com for f... e, em seguida, envolva o mv dentro de um condicional (consulte, por exemplo, TestsAndConditionals em BashGuide):

cd /Vinodh
for f in *TEST* ; do
    if grep -q WORLD "$f" ; then
        mv "$f" "/TEST/$f.txt"
    fi
done
    
por 13.12.2017 / 13:19
0

Assumindo que seu shell é Bash:

source_directory='/Vinodh'
destination_directory='/TEST'
for file in "$source_directory/"*; do
  renamed_file="$(basename "$file")"
  if grep -q 'WORLD' "$file"; then
    echo "Moving \"$file\" to \"$destination_directory/${renamed_file%.*}.txt\""
    mv "$file" "$destination_directory/${renamed_file%.*}.txt"
  fi
done
  1. Itere todos os arquivos em $source_directory .
  2. Extraia o nome do arquivo (a parte após o último / ).
  3. Procure a string WORLD no arquivo; grep -q é q uiet, ou seja, apenas define o código de saída e não imprime o que fez.
  4. Se a string for encontrada no arquivo, mova-a para $destination_directory substituindo qualquer sufixo por .txt .
por 13.12.2017 / 13:20
0

Aqui está um folheto para você:

cd /Vinodh && for x in $(grep -sl 'WORLD' *TEST*); do mv "$x" "/TEST/$x.txt"; done
    
por 13.12.2017 / 14:01
0
grep -li "world" /Vinodh/* | awk '{print "mv" " " $1 " " "/TEST/"}' | sh
    
por 13.12.2017 / 15:54