File duplicato x volte nella shell dei comandi


22

Provo a duplicare un file video x volte dalla riga di comando usando un ciclo for, l'ho provato in questo modo, ma non funziona:

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done

5
Il tuo unico errore echonon è quale non dovrebbe esserci e $1quale dovrebbe essere $i?
Julie Pelletier

se rimuovo l'eco e lo uso solo test$1.oggallora dice: test.ogg e test.ogg sono gli stessi file , quindi sembra che $ 1 non sia riconosciuto?
Nero,

@EdwardBlack: Sembra che io abbia capito male le tue esigenze. Quella soluzione non è adatta.
cuonglm,

@JuliePelletier, accidenti, a volte mi capita che scrivo per caso $1invece di $i, è la mattina presto, scusa ... grazie. Userò $xin futuro invece di$i
Black

Risposte:


25

Il codice della shell presenta due problemi:

  1. Non echodovrebbe essere lì.
  2. La variabile $iè errata come $1nel nome del file di destinazione.

Per creare una copia di un file nella stessa directory del file stesso, utilizzare

cp thefile thecopy

Se si inserisce qualcos'altro, ad es

cp thefile theotherthing thecopy

quindi si presume che si desidera copiare thefilee theotherthingnella directory chiamata thecopy.

Nel tuo caso, sembra specificamente per un file chiamato test.ogge uno di nome echoper copiare nella directory test$1.ogg.

Il $1molto probabilmente espanderà a una stringa vuota. Questo è il motivo per cui, quando si elimina echodal comando, si ottiene "test.ogg e test.ogg sono gli stessi file"; il comando in esecuzione è essenzialmente

cp test.ogg test.ogg

Questo è probabilmente un errore di battitura.

Alla fine, vuoi qualcosa del genere:

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

Oppure, in alternativa

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

Oppure, usando tee:

tee test{1..100}.ogg <test.ogg >/dev/null

Nota: molto probabilmente funzionerebbe per 100 copie, ma per migliaia di copie potrebbe generare un errore "Elenco argomenti troppo lungo". In tal caso, ripristina l'utilizzo di un loop.


12

Corto e preciso

< test.ogg tee test{1..100}.ogg

o meglio ancora

tee test{1..100}.ogg < test.ogg >/dev/null

vedere l' utilizzo del comando tee per ulteriori informazioni.

Aggiornare

come suggerito da @Gilles, l'utilizzo teeha il difetto di non conservare i metadati dei file. Per ovviare a questo problema, potrebbe essere necessario eseguire il comando seguente dopo:

cp --attributes-only --preserve Source Target

3
Questo è potenzialmente più veloce di più chiamate a cp(dipende dalla dimensione del file rispetto alla memoria disponibile), ma ha il difetto di non conservare alcun metadata del file.
Gilles 'SO- smetti di essere malvagio' il

@Gilles ohh, possiamo superarlo?
Rahul,

3
Puoi correre cp --attributes-onlydopo.
Gilles 'SO- smetti di essere malvagio' il

@Gilles grazie, ho aggiornato la mia risposta secondo il tuo aiuto.
Rahul,

FWIW nessuna delle altre risposte è stata utilizzata cp -pper conservare i metadati.
roaima,

11
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done

1
Le espansioni variabili devono essere quotate.
gatto,

1

Il comando folowing copia file.a 5 volte:

$ seq 5 | xargs -I AA cp file.a fileAA.a

Se preferisci dd (non uguale a cp!):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a

0

Non hai chiamato variabile i durante la copia

usa lo script seguente. Come testato ha funzionato bene

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done

3
È lo stesso di due risposte precedenti e di un commento tranne (1) la domanda fa circa 100 e la tua risposta usa 10, (2) a cui hai aggiunto inutilmente le -rvfopzioni cpe (3) non hai citato l'espansione della tua variabile . (Nota anche che è convenzionale avere uno spazio tra i simboli di punteggiatura come ;e la parola seguente.) L'aggiunta -pdell'opzione è preziosa, ma (4a) è già stata indirizzata (nei commenti) e (4b) la tua risposta non è utile se non spieghi cosa stai facendo.
Scott,
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.