staging.inyokaproject.org

bash Befehl mit Zahlen "von bis" öfter ausführen

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

Aurelius

Anmeldungsdatum:
15. Mai 2020

Beiträge: 7

Hallo Linuxer,

ich möchte einen Befehl öfter ausführen und dabei nur einen Zahl ändern. Sowas wie:

rm datei-1.txt
rm datei-2.txt
rm datei-3.txt
rm datei-4.txt
rm datei-5.txt

Würde ich gerne schneller erledigen, ich weiß aber nicht wie. Also sowas in der Art nur... ...so, dass es funktioniert hrhr:

rm datei-'1-5'.txt

Wie kann man das machen?

Ciao Aurel

DJKUhpisse Team-Icon

Supporter, Wikiteam
Avatar von DJKUhpisse

Anmeldungsdatum:
18. Oktober 2016

Beiträge: 18245

Du könntest eine Variable hochzählen lassen (und vorher von/bis als Übergabeparameter nutzen). Dann den Anfangsdateinamen als Variable nehmen und die Zahl anhängen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Aurelius schrieb:

Würde ich gerne schneller erledigen, ich weiß aber nicht wie. Also sowas in der Art nur... ...so, dass es funktioniert hrhr:

rm datei-'1-5'.txt

Wie kann man das machen?

Mit einer Brace Expansion:

rm datei-{1..5}.txt 

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Z.B. mit Shell-Globs. Hat aber Tücken und Untiefen.

  • Dateien erzeugen:

    touch datei-{1,2,3,4,5}.txt 
  • Dateien vernichten:

    rm datei-[1-5].txt 

Oder mit einer Schleife:

for (( i = 1 ; i <= 5 ; i++ )) { rm datei-${i}.txt ;} 

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

kB schrieb:

Z.B. mit Shell-Globs. Hat aber Tücken und Untiefen.

  • Dateien erzeugen:

    touch datei-{1,2,3,4,5}.txt 

Die einzige Tücke ist, dass man da keine Variablenersetzung in der geschweiften Klammer machen kann:

Dateien erzeugen:

touch datei-{1..5}.txt 

Geht nicht:

max=5; touch datei-{1..$max}.txt 

Aber es geht auch Sachen wie:

rm datei-{1..5}{0..9}.txt 

umd die Dateien 10 bis 59 zu löschen, oder

Aber es geht auch Sachen wie:

rm datei-{1..59}.txt 

oder mit führender Null:

touch datei-{01..59}.txt 

mit Buchstaben:

echo datei-{j..r}.txt 

Der Unterschied zum [j-r]-Muster ist, dass die geschweiften Klammern zuerst aufgelöst werden, und dann wird der Befehl ausgeführt, während die eckigen Klammern ein Filematching provozieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

touch datei-o.txt

ls datei-[j-r].txt 
datei-o.txt

ls datei-{j..r}.txt 
ls: Zugriff auf 'datei-j.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-k.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-l.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-m.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-n.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-p.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-q.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'datei-r.txt' nicht möglich: Datei oder Verzeichnis nicht gefunden
datei-o.txt

sprich: Wenn es um bestehende Dateien geht, sind die Backsteinklammern günstiger.

Ein touch dat-[a-z].txt würde aber eine Datei mit fancy Namen erzeugen, nicht 26 Stück. Die geschweiften Klammern lassen sich auch fernab von Dateinamen benutzen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

user_unknown schrieb:

Die einzige Tücke ist, dass man da keine Variablenersetzung in der geschweiften Klammer machen kann:

Geht nicht:

max=5; touch datei-{1..$max}.txt 

Da kann man sich mit eval behelfen:

max=5
eval touch datei-{1..$max}.txt 

Der Unterschied zum [j-r]-Muster ist, dass die geschweiften Klammern zuerst aufgelöst werden, und dann wird der Befehl ausgeführt, während die eckigen Klammern ein Filematching provozieren:

Wenn man rm nutzt, kann man mit -f dafür sorgen, dass nicht existierende Dateien nicht stören. Wenn ein glob-Befehl nichts findet, nimmt er den Ausdruck wörtlich (und dann würde ls auch meckern, wenn es den angegebenen Namen nicht findet), es sei denn man hat shopt -s nullglob gesetzt (in dem Fall würde ls den Inhalt des aktuellen Ordners listen).

Antworten |