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?


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).


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.