2010-01-18 9 views
35

Próbuję użyć tablicy do przechowywania listy nazw plików za pomocą polecenia find.Jak mogę przetworzyć wyniki wyszukiwania w skrypcie basha?

Z jakiegoś powodu tablica nie działa w bash używanych przez szkoły, mój program działa na moim laptopie chociaż.

Więc zastanawiałem się, czy istnieje inny sposób to zrobić, to jest to, co mam:

array = (`find . -name "*.txt"`) #this will store all the .txt files into the array 

Wtedy mogę uzyskać dostęp do elementów tablicy i zrobić kopie wszystkich plików za pomocą polecenia cat.

Czy jest inny sposób, aby to zrobić bez korzystania z tablicy?

Odpowiedz

75

Można użyć coś takiego:

find . -name '*.txt' | while read line; do 
    echo "Processing file '$line'" 
done 

Np wykonać kopię:

find . -name '*.txt' | while read line; do 
    echo "Copying '$line' to /tmp" 
    cp -- "$line" /tmp 
done 

HTH

+0

wielkie dzięki! zadziałało i nauczyłem się czegoś nowego – Shellscriptbeginner

+0

Korzystanie z pętli 'for' jest zdecydowanie lepszym wyborem. Używanie tablicy zadziała, z wyjątkiem tego, że odczyta całą listę jako zmienną, a następnie iteruje po zmiennej. Ta wersja czyta każdą nazwę pliku pochodzącą od 'find' i przetwarza ją w linii. –

+0

D.Shawley, czy mógłbyś wysłać próbkę z pętlą for? Powinien działać również dla plików z spacjami w nazwie. –

2
find . -name '*.txt' | while IFS= read -r FILE; do 
    echo "Copying $FILE.." 
    cp "$FILE" /destination 
done 
6

Tylko nie umieścić spacje wokół znaku równości:

ar=($(find . -name "*.txt")) 

Unikaj odwrócone, pojedyncze apostrofy, jeśli to możliwe, ponieważ są one przestarzałe. Można je łatwo pomylić z apostrofami, szczególnie w biednych czcionkach i nie gniazdują tak dobrze.

W większości przypadków będzie najlepiej służył jeśli iterację Find-wynikać bezpośrednio z -exec, -execdir, -ok lub -okdir.

Dla natomiast pętle i są trudne do zrobienia rację, jeśli chodzi o puste miejsca w nazwach plików lub znakami nowej linii i kartami.

find ./ -name "*.txt" -exec grep {} ";" 

{} nie wymaga maskowania. Będziesz często zobaczyć kombinacja znaleźć/xargs który uruchamia dodatkowy proces TOO:

find ./ -name "*.txt" | xargs grep {} ";" 
14

miałem problem z roztworem Johannes Weiss, jeśli właśnie robi echo będzie pracować pełną listę plików. Jeśli jednak spróbuję uruchomić ffmpeg w następnej linii, skrypt będzie przetwarzał tylko pierwszy napotkany plik. Założyłem pewną śmieszną firmę IFS z powodu fajki, ale nie mogłem tego rozgryźć i zamiast tego uruchomiłem pętlę for:

for i in $(find . -name '*.mov'); 
do 
    echo "$i" 
done 
+1

To nie powoduje białych znaków w nazwach plików – spinup

Powiązane problemy