Kopieren Sie eine Reihe von Dateien in die Befehlszeile (ZSH / BASH).

12

Ich habe eine Liste von Dateien mit fortlaufenden Nummern als Suffixe. Ich möchte nur einen Bereich dieser Dateien kopieren. Wie kann ich einen Bereich als Teil meines Befehls cp angeben?

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

Ich möchte Dateien von P1080275.JPG nach P1080283.JPG mit etwas ähnlichem kopieren wie:

$cp P10802[75-83].JPG ~/Images/.

Gibt es eine Möglichkeit, dies zu tun?

Amjith
quelle

Antworten:

24

Du warst sehr nah. Ihre Frage war fast die richtige Syntax:

cp P10802{75..83}.JPG ~/Images
Glenn Jackman
quelle
9

So iterieren Sie in Bash über einen Bereich:

for x in {0..10}; do echo $x; done

Wenden Sie dasselbe in Ihrem Fall an:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
Shyam Sundar CS
quelle
Das funktioniert, aber ich mag die Antwort von @glenn jackman besser, da sie kein Programmierkonstrukt aufruft.
Amjith
4

Zsh hat mit der Extendedglob-Option den Globbing- Operator (Pattern Matching).

setopt extendedglob
echo P10802<75-83>.JPG

stimmt mit den Dateinamen im aktuellen Verzeichnis überein, die diesem Muster entsprechen (beachten Sie, dass P1080275.JPG übereinstimmt, P108020000000075.JPG jedoch auch)

Am anderen Ende wird der Zeichenfolgenerweiterungsoperator {x ... y} (unterstützt von zsh und neueren Versionen von bash und ksh93) auf die Zeichenfolgen von x nach y erweitert, unabhängig davon, welche Dateien sich im aktuellen Verzeichnis befinden.

cp P10802<75-83>.JPG ~there

kopiert die passenden Dateien, so wird

cp P10802{75..83}.JPG ~there

Sie erhalten jedoch Fehler, wenn beispielsweise P1080281.JPG nicht vorhanden ist.

sch
quelle
1

Würde das für Sie funktionieren:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
Janne Pikkarainen
quelle