UNIX-Shell: Befehl nur ausführen bei Dateinamen

Hallo,

Wie lautet in der UNIX-Shell der Befehl dafür, dass folgender Befehl nur ausgeführt wird, wenn in dem Ordner mindestens eine Datei mit dem Dateinamensanfang „ab#“ vorliegt?

mv /Users/martin/Desktop/Test/ab#* /Users/martin/Desktop/Test/abeinsortiert

Danke,
Martin

Hallo Martin,

ich vermute mal, dass ‚abeinsortiert‘ ein existierendes Directory ist (ansonsten würden ja alle Files auf ein File bewegt…).

Mein Vorschlag (ungetestet)

ls /Users/martin/Desktop/Test/ab#\* \> /dev/null && \
mv /Users/martin/Desktop/Test/ab#\* /Users/martin/Desktop/Test/abeinsortiert

gruss
bernhard

Hallo Bernhard,

ich vermute mal, dass ‚abeinsortiert‘ ein existierendes
Directory ist (ansonsten würden ja alle Files auf ein File
bewegt…).

Ja, ist es.

Mein Vorschlag (ungetestet)

ls /Users/martin/Desktop/Test/ab#* > /dev/null &&
mv /Users/martin/Desktop/Test/ab#*
/Users/martin/Desktop/Test/abeinsortiert

Klappt leider nicht, der move-befehl wird auch dann ausgeführt, wenn keine Datei mit dem Anfang ab# vorliegt.

Gruß,
Martin

Hallo,

„eigentlich“ ein klassischer Fall für „find“

http://www.linux-fuer-blinde.de/91-0-dateien-aufspue…

Beispiel (Achtung: NICHT getestet!):

find /Users/martin/Desktop/Test -name ‚ab*‘ -print -exec mv ‚{}‘ /Users/martin/Desktop/Test/abeinsortiert ;

sollte so laufen. Da „abeinsortiert“ ja auch die Bedingung ab* erfüllt, gibt es eine Fehlermeldung, da der Eintrag ja nicht in sich selbst verschoben werden kann. Ändert aber nichts am Ergebnis.

Kann man natürlich viel eleganter machen, allein: momentan fehlt mir die Zeit.

Viel Erfolg.

tf

Hallo Martin,

das klappt schon - nicht der move-Befehl wird ausgeführt, nur das ls macht noch eine Fehlerausgabe (nicht nach STDOUT, sondern nach STDERR). Ich hätte auch STDERR nach /dev/null umleiten müssen (siehe unten 2>&1 ). Jetzt hab ich es mal bei mir getestet, und so geht es:

bbr@bbvbub1010:~/tmp$ ll
insgesamt 12
drwxr-xr-x 3 bbr bbr 4096 2010-11-03 20:20 ./
drwxr-xr-x 26 bbr bbr 4096 2010-11-03 20:18 ../
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:18 1
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:18 2
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:18 3
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:20 ab#3
drwxr-xr-x 2 bbr bbr 4096 2010-11-03 20:19 abeinsortiert/
bbr@bbvbub1010:~/tmp$ ls ab#\* \> /dev/null 2\>&1 && mv ab#\* abeinsortiert
bbr@bbvbub1010:~/tmp$ ll abeinsortiert/
insgesamt 8
drwxr-xr-x 2 bbr bbr 4096 2010-11-03 20:21 ./
drwxr-xr-x 3 bbr bbr 4096 2010-11-03 20:21 ../
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:18 ab#1
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:19 ab#2
-rw-r--r-- 1 bbr bbr 0 2010-11-03 20:20 ab#3
bbr@bbvbub1010:~/tmp$ ls ab#\* \> /dev/null 2\>&1 && mv ab#\* abeinsortiert
bbr@bbvbub1010:~/tmp$

gruss
bernhard

Noch eine Spielerei, die find-Variante oben sollte robuster sein:

ls ab#*|while read fn; do [-f $fn] && mv $fn abeinsortiert; done

Gruß Lutz

1 Like

Es ist erstmal nett, dass ihr mir alle versucht zu helfen, aber leider funktioniert keines der Skripte. In der Windows-Batch habe ich das immer mit einer for-Schleife gemacht, die wie folgt aussah:

cd /Users/martin/Desktop/Test & for /f "tokens=2 delims=#" %%a in ('dir /b ab#\*') do move /Users/martin/Desktop/Test/ab#\* /Users/martin/Desktop/Test/#abeinsortiert 

Gibt es so etwas ähnliches in der UNIX-Shell?

Gruß,
Martin

Hi,

nochmal oben beginnend: Was ist die Ausgangssituation? Wie sieht der relevante Teil der Verzeichnisstruktur aus? Soll automatisch über diesen Teil iteriert werden?

Wie relevant ist der move-Befehl, ist das einfach nur ein Beispielkommando?

Könntest Du sowas einfaches wie

if ls ab#*; then command; else echo „File not found“; fi

suchen, wobei command durch die gewünschte Aktion zu ersetzen ist?

Gruß Lutz