Copia un intervallo di file nella riga di comando (ZSH / BASH)


13

Ho un elenco di file con numeri consecutivi come suffissi. Vorrei copiare solo una serie di questi file. Come posso specificare un intervallo come parte del mio comando cp.

$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*

Vorrei copiare i file da P1080275.JPG a P1080283.JPG con qualcosa di simile a:

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

C'è un modo per fare questo?

Risposte:


25

Eri molto vicino. La tua domanda era quasi la sintassi corretta:

cp P10802{75..83}.JPG ~/Images

9

Per scorrere su un intervallo in bash:

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

Applicando lo stesso nel tuo caso:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done

Funziona, ma mi piace la risposta di @glenn jackman perché non invoca alcun costrutto di programmazione.
Amjith

4

Zsh, con l'opzione extendedglob ha l' operatore globbing (pattern matching).

setopt extendedglob
echo P10802<75-83>.JPG

corrisponderà ai nomi di file nella directory corrente che corrispondono a quel modello (attenzione che P1080275.JPG corrisponde ma anche P10802000000000075.JPG)

Dall'altro lato, l'operatore di espansione della stringa {x ... y} (supportato da zsh e versioni recenti di bash e ksh93), si espande nelle stringhe da x a y, indipendentemente dai file presenti nella directory corrente.

cp P10802<75-83>.JPG ~there

copierà i file corrispondenti, così sarà

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

Ma otterrai errori se per esempio P1080281.JPG non esiste.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.