staging.inyokaproject.org

Möglichkeiten Zeilenweise (bei ls z.B.) Befehle auf Datei/Ordner ausüben

Status: Gelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

Naros

Anmeldungsdatum:
20. September 2008

Beiträge: Zähle...

Hallo liebe Community,

ich habe neuerdings das Shellprogrammieren für mich entdeckt, nur leider stoße ich zu oft auf das oben genannte Problem. Ich möchte beispielsweise eine mehrzeilige Ausgabe, zeilenweise abarbeiten. Gibt es Möglichkeiten, dies zu bewerkstelligen?

Beispiel:

Als erstes Speicher ich die Ausgabe in eine Variable

1
dirs=$(find -maxdepth 1 -type d | cut -c 3-)

Nun würde ich gerne auf jedes Element in dirs etwas ausführen. Z.B.

1
2
3
cd $einzelnesDirElement
git init
cd ../

Ein weiteres Problem wo ich hänge ist, dass ich dies gerne in eine Schleife packen würde. Also:

1
2
3
4
5
6
while (([kein element in $dirs vorhanden]))
do
    cd $einzelnesDirElement
    git init
    cd ../
done

Danke für eure Hilfe schon mal

nullEuro

Avatar von nullEuro

Anmeldungsdatum:
26. Februar 2009

Beiträge: 225

Hi,

Sofern du die Gesamtausgabe später nicht mehr brauchst, musst du sie nicht in einer Variable zwischenspeichern. Versuch es damit:

1
2
3
4
5
6
find -maxdepth 1 -type d | cut -c 3- | while read line
do
cd $line
git init
cd ../
done

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Oder evtl. auch

1
2
3
4
5
6
for dir in $(find -maxdepth 1 -type d | cut -c 3-)
   do
      cd $dir
      git init
      cd ..
   done

DiBo33

Anmeldungsdatum:
16. Juni 2006

Beiträge: 1827

Naros schrieb:

Als erstes Speicher ich die Ausgabe in eine Variable

1
dirs=$(find -maxdepth 1 -type d | cut -c 3-)

Nun würde ich gerne auf jedes Element in dirs etwas ausführen. Z.B.

1
2
3
cd $einzelnesDirElement
git init
cd ../

Einfach mittels For-Schleife

1
2
3
4
5
6
7
8
#!/bin/bash
dirs=$(find -maxdepth 1 -type d | cut -c 3-)
for dir in $dirs
do
    cd $dir
    git init
    cd ..
done

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

speziell für deine Situation braucht’s weder find noch cut noch cd. Außerdem gehe ich davon aus, dass du im aktuellen Verzeichnis nicht auch ein Git-Repo erzeugen willst (erster Treffer von find – übrigens wird daraus bei den bisherigen Ansätzen durch das cut dein Home-Verzeichnis). Falls doch, braucht es eben noch ein zusätzliches git init außerhalb der Schleife.

1
2
3
4
for i in */
do
    git init "$i"
done

Wobei es das cut auch mit cd nicht bräuchte. cd ./foo ist dasselbe wie cd foo.

Übrigens: Für den unwahrscheinlichen Fall, dass Hässlichkeiten wie Leerzeichen in den Verzeichnisnamen auftauchen, schau’ dir bei Verwendung von find mal den Parameter -print0 an.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Man braucht kein print0, und kein for, wenn man find hat:

1
find -maxdepth 1 -type d -execdir git init {} + 

aber wenn die Ordnernamen brav sind, ist auch for eine einfache, und daher überzeugende Lösung.

Da ich kein git verwende habe ich obiges Kommando nicht ausprobiert. Man sollte also find und git ein wenig kennen, bevor man es ausprobiert, und überprüfen, ob da nicht eine Falle lauert, die ein nicht-Gitler vielleicht übersieht.

-okdir würde vor jedem Verzeichnis/Befehl nochmal fragen, ob man tatsächlich möchte:

1
find -maxdepth 1 -type d -okdir git init {} + 

Naros

(Themenstarter)

Anmeldungsdatum:
20. September 2008

Beiträge: 36

Vielen Dank für die zahlreichen Antworten.

Das von mir gewählte Beispiel war jetzt auch kein konkretes. Leider ist mir um diese Uhrzeit kein besseres eingefallen. Konkret hatte ich vor für jedes Git-Repo was ich habe "gitstats" auszuführen. Da ich relativ viele habe und diese sich auch wöchentlich ändern. Hatte ich mir überlegt per Conjob ein Shell-Skript für diesen Aufruf zu schreiben.

Ich werds heute mal testen.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21863

1
2
3
4
5
dirs=$(find -maxdepth 1 -type d | cut -c 3-)
for i in ${dirs[@]}
do
 gitstats
done

sollte es auch tun

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

redknight schrieb:

1
2
3
4
5
dirs=$(find -maxdepth 1 -type d | cut -c 3-)
for i in ${dirs[@]}
do
 gitstats
done

sollte es auch tun

gitstats erwartet keine Argumente? Dann geht auch

1
find -maxdepth 1 -type d -execdir gitstats ";"

Komplexere Dinge kann man in ein ad-hoc-Script schreiben, und

1
find -maxdepth 1 -type d -execdir /home/naros/some/foo/bar/adhoc.sh {} ";"
Antworten |