Bash - переместить те файлы, которые содержат строку, в каталог

0

задача : Создать скрипт, который будет принимать 2 аргумента:

3.sh <directory> <destination>

Искать файлы в <directory> для подстроки moveme ”В содержании файла Переместить те файлы, которые содержат строку в каталог <destination>

Мой баш :

#!/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

Вопрос : Как перенести файл поиска из одного каталога в другой?

HerrGrau
источник
mv $directory/$file $destination/$file ?
NickW
Да, конечно, но какой конкретно файл?
HerrGrau
$ file - & gt; как записать в эту переменную полученный результат из grep
HerrGrau
Вы, вероятно, захотите использовать цикл while, чтобы установить переменную, которая содержит grep, пока он существует, и, если это файл, переместите его в новый каталог ..
NickW
да по теории я понимаю как это сделать, но на практике? .. :(
HerrGrau

Ответы:

0

grep вернет список файлов. Вам нужно выполнить mv по каждому из файлов.

Ты можешь использовать xargs как предложено в другом ответе, но я предпочитаю это на вкладыше:

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

Перебирает список файлов, возвращаемых grep и перемещает их один за другим.

Возможно, вам понадобится добавить проверку ошибок, поэтому вот более читаемая версия:

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

Кроме того, я считаю, что обычно хорошей идеей является изменение переменной IFS перед циклом такого типа

export IFS=$'\n'

Таким образом, вы избежите многих проблем с файлами, в имени которых есть пробел (если в них не вставлен символ новой строки).

GnP
источник
Обратите внимание, что для & lt; n & gt; файлы и & lt; m & gt; соответствующие файлы, вызовы метода xargs grep & Л; п & GT; раз и mv & Lt; м & GT; раз. Циклические вызовы grep только однажды.
GnP
Изменение IFS не рекомендуется просто для исправления команды, которая ломается на пустом месте. Если вы хотите перебирать файлы, лучше использовать find И его -exec возможностей. Кроме того, вы должны заключить в кавычки ваши переменные.
slhck
0
str="moveme"
find "$1"/* -prune -type f -exec grep -l "$str" "{}" \; | xargs -i echo mv -i "{}" "$2"/

На самом деле, чтобы проверить нет. аргументов, проверка $ 2 достаточно

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

Что еще более важно, вы должны обработать возможные перезаписи файлов в $ 2.

chingNotCHing
источник
Когда трубопровод от find в xargsиспользовать find … -print0 | xargs -0
slhck
Благодарю. Только что узнал, как избежать возможного \ n в имени файла из вашего комментария.
chingNotCHing
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
HerrGrau
источник