Bash - Przenieś pliki zawierające ciąg do katalogu

0

Zadanie : Utwórz skrypt, który przyjmie 2 argumenty:

3.sh <directory> <destination>

Wyszukaj w pliku <directory>podłańcuch „ moveme ” w treści pliku Przenieś pliki zawierające ciąg do katalogu<destination>

My 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

Pytanie : Jak przenieść znaleziony plik z jednego katalogu do drugiego?

HerrGrau
źródło
mv $directory/$file $destination/$file?
NickW
Tak, oczywiście, ale które konkretnie złożyć?
HerrGrau
Plik $ -> jak pisać w tej zmiennej otrzymałem resoult z grep
HerrGrau
Prawdopodobnie będziesz chciał użyć pętli while, aby ustawić zmienną zawierającą grep, dopóki on istnieje, a jeśli jest to plik, przenieś go do nowego katalogu.
NickW
tak, teoretycznie rozumiem, jak to zrobić, ale w praktyce? .. :(
HerrGrau

Odpowiedzi:

0

grepzwróci listę plików. Musisz wykonać mvna każdym z plików.

Możesz użyć xargszgodnie z sugestią w innej odpowiedzi, ale wolę ten on-line:

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

Iteruje po liście plików zwróconych przez grepi przenosi je jeden po drugim.

Może być konieczne dodanie sprawdzania błędów, więc tutaj jest bardziej czytelna wersja:

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

Ponadto uważam, że zwykle dobrym pomysłem jest zmiana zmiennej IFS przed tego rodzaju pętlą

export IFS=$'\n'

W ten sposób unikniesz wielu problemów z plikami z białymi znakami w nazwie (chyba że mają osadzony znak nowej linii).

GnP
źródło
Zauważ, że dla <n> plików i <m> pasujących plików, metoda xargs wywołuje grep<n> razy i mv<m> razy. Połączenia pętli for greptylko raz.
GnP
Zmiana IFS nie jest zachęcana tylko do naprawienia polecenia, które łamie się na białych znakach. Jeśli chcesz iterować po plikach, lepiej użyć findi jego -execmożliwości. Powinieneś także dwukrotnie zacytować swoje zmienne.
slhck
0
str="moveme"
find "$1"/* -prune -type f -exec grep -l "$str" "{}" \; | xargs -i echo mv -i "{}" "$2"/

W rzeczywistości, aby sprawdzić nie. argumentów wystarczy sprawdzenie 2 $

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

Co ważniejsze, powinieneś obsłużyć możliwe nadpisania plików w 2 USD.

chingNotCHing
źródło
Podczas findxargsfind … -print0 | xargs -0
przesyłania
Dzięki. Właśnie nauczyłem się, jak unikać możliwego \ nw nazwie pliku z Twojego komentarza.
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
źródło