Durchlaufen von Alphabeten in Bash

82

Ich möchte mvalle Dateien, die mit 'x' beginnen, in das Verzeichnis 'x' verschieben. etwas wie:

mv path1/x*.ext path2/x

und mache es für alle Buchstaben a, ..., z

Wie kann ich ein Bash-Skript schreiben, das 'x'-Schleifen durch das Alphabet führt?

behzad.nouri
quelle

Antworten:

135
for x in {a..z}
do
    echo "$x"
    mkdir -p path2/${x}
    mv path1/${x}*.ext path2/${x}
done
Kamil Dziedzic
quelle
1
Darf ich fragen, warum Sie x in der 4. und 5. Zeile mit geschweiften Klammern versehen?
Jiaqi Li
Es ist hier nicht erforderlich, aber gut, es funktioniert und lässt Parameter besser hervorstechen;) gnu.org/software/bash/manual/…
Kamil Dziedzic
1
Normalerweise "$x"ist es genug und ein besserer Weg, um es hervorzuheben.
Weijun Zhou
39

Dies sollte Ihnen den Einstieg erleichtern:

for letter in {a..z} ; do
  echo $letter
done
Matte
quelle
19

Hier erfahren Sie, wie Sie das spanische Alphabet mithilfe der verschachtelten Klammererweiterung generieren

for l in {{a..n},ñ,{o..z}}; do echo $l ; done | nl
1  a
 ...
14  n
15  ñ
16  o
...
27  z

Oder einfach

echo -e {{a..n},ñ,{o..z}}"\n" | nl

Wenn Sie das veraltete spanische Alphabet mit 29 Zeichen generieren möchten

echo -e {{a..c},ch,{d..l},ll,{m,n},ñ,{o..z}}"\n" | nl

Ähnliches könnte für das französische oder das deutsche Alphabet erfolgen.

Luis Muñoz
quelle
3

Verwenden von rename:

mkdir -p path2/{a..z}
rename 's|path1/([a-z])(.*)|path2/$1/$1$2' path1/{a..z}*

Wenn Sie das führende [az] -Zeichen vom Dateinamen entfernen möchten, lautet das aktualisierte perlexpr:

rename 's|path1/([a-z])(.*)|path2/$1/$2' path1/{a..z}*
anishsane
quelle
2

Auch mit Großbuchstaben

for letter in {{a..z},{A..Z}}; do
  echo $letter
done
Thanh Trung
quelle
1

Diese Frage und die Antworten haben mir teilweise bei meinem Problem geholfen.
Ich musste in Bash über einen Teil des Alphabets lupen.

Obwohl die Erweiterung ausschließlich in Textform erfolgt

Ich habe eine Lösung gefunden: und es noch einfacher gemacht:

START=A
STOP=D
for letter in $(eval echo {$START..$STOP}); do
    echo $letter
done

Was in ... endet:

A
B
C
D

Ich hoffe, es ist hilfreich für jemanden, der nach dem gleichen Problem sucht, das ich lösen musste, und landet auch hier

Alphons
quelle