Bash - Move os arquivos que contêm a string para o diretório

0

Tarefa : Crie um script que leve 2 argumentos:

3.sh <directory> <destination>

Pesquise os arquivos em <directory> para substring “ moveme ” no conteúdo do arquivo Mova os arquivos que contêm a string para o diretório <destination>

Meu Bash :

#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry..."
else
    if [ "$2" == "" ]; then
        echo "Retry ..."
    else
        echo "Try to fiend in folder {$1} files with this content {123} "
        grep -l "123" $1/*
        #grep -c "123" $1/*
    fi
fi

Pergunta : Como transferir um arquivo encontrado de um diretório para outro?

    
por HerrGrau 23.01.2014 / 12:26

3 respostas

0

grep retornará uma lista de arquivos. Você precisa executar mv sobre cada um dos arquivos.

Você pode usar xargs como sugerido em outra resposta, mas eu prefiro esse tipo de linha:

for file in $(grep -l "123" $1/*); do mv $file $2; done

Ele itera sobre a lista de arquivos retornados por grep e os move um por um.

Pode ser necessário adicionar alguma verificação de erros, por isso aqui está uma versão mais legível:

for file in $(grep -l "123" $1/*); do
    mv $file $2;
done

Além disso, acho que geralmente é uma boa idéia mudar a variável IFS antes desse tipo de loop

export IFS=$'\n'

Dessa forma, você evitará muitos problemas com arquivos que tenham espaço em branco no nome (a menos que eles tenham um caractere de nova linha incorporado).

    
por 23.01.2014 / 20:07
0
str="moveme"
find "$1"/* -prune -type f -exec grep -l "$str" "{}" \; | xargs -i echo mv -i "{}" "$2"/

Na verdade, para verificar não. de argumentos, verificando $ 2 é suficiente

if [ "$2" == "" ]; then
        echo "Retry ..."

Mais importante, você deve lidar com as possíveis sobrescritas dos arquivos em $ 2.

    
por 23.01.2014 / 16:58
0
#!/bin/bash

if [ "$1" == "" ]; then
    echo "Retry... ./3.sh {folder_from}/ {text} {folder_to}/"
else
    if [ "$2" == "" ]; then
        echo "Retry ... ./3.sh {folder_from}/ {text} {folder_to}/"
    else
        echo "Try to find in folder {$1} files with this content {123} "
        cd ~/tasks/$1
        grep -l "123" * > list.txt
        while read line
        do
            name=$line
            mv $line  ~/tasks/$3/$line
        done < list.txt
        #grep -c "123" $1\/*
        rm list.txt
    fi
fi
    
por 24.01.2014 / 09:10

Tags