Задача: Создать скрипт, который будет принимать 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

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

3 ответа3

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.

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
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'

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .