Spostare un intervallo di file numerati?


14

Ho 291 file numerati (a partire da 001 - titolo e fino a 291 - titolo) che devono essere spostati in directory separate. (Da 001 a 021 nella cartella 1, da 022 a 053 nella cartella 2, non sono necessariamente lo stesso numero di file ogni volta).

Ho pensato di poterlo fare in un modo schifoso come questo: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Sono quasi sicuro che ci sia un modo migliore, quindi quale sarebbe?

EDIT: Quindi avrebbe funzionato bene, ma mi sono ricordato ...

Non sono bloccato con un terminale, quindi ho usato un file manager per fare clic e trascinare. La domanda è ancora valida.


1
Volete 21 sottocartelle nella cartella 1 e 22 cartelle nella cartella 2?
— Daniel Beck

Hai recensito unix.SE? C'è una buona discussione qui: unix.stackexchange.com/questions/12976/…
— chrisjlee,

@DanielBeck no, voglio che i file si spostino in ogni cartella. Esiste un numero diverso di file che vanno in ciascuna cartella.
— Rob,

@ ChrisJ.Lee È abbastanza simile a quello che stavo facendo / ho fatto prima, mi piace. Dato che i file corrispondono ad altri file in un'altra cartella, ho potuto ls -l | grep ^- | wc -lottenere il numero di righe.
— Rob,

1
@Rob Right. Tuttavia, diverso numero di file in ciascuna directory. Automatizzare questo (comprese le regole) è più uno sforzo che farlo da soli alcune volte.
— Daniel Beck

Risposte:


25

Dal momento che hai detto che non sono sempre esattamente 21 i file che devi spostare manualmente i file, e per farlo in modo efficace potresti usare l' espansione del controvento :

mv filename{001..21} dir1
mv filename{022..53} dir2
...

Sembra che potrebbe funzionare, lo proverò.
— Rob,

1
Funziona perfettamente se aggiungi un carattere jolly dopo le parentesi. Questo è esattamente ciò di cui avevo bisogno.
— Rob,

2
Se il numero si trova nel mezzo del nome, è possibile scrivere file{001..21}name, non è necessario utilizzare il carattere jolly. Comunque, felice che abbia funzionato per te.
— drrlvn,

1

Ciò sposterà i file come descritto (tranne per il fatto che il secondo intervallo sarebbe compreso tra 022 e 042 per i secondi 21 file).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

Non sono sempre 21 file, ma grazie.
— Rob,

0

Quello che voglio dire è spostare molti file (come diecimila o un milione), la shell si lamenterà troppo a lungo dell'elenco dei file se usi solo {1..20}, quindi

In zsh , puoi caricare il mv builtin:

setopt extended_glob zmodload

zsh / file

dopo averlo fatto, puoi usare il comando come:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

o se stai scrivendo degli script di shell, puoi fare qualcosa del genere:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

se non si utilizza zsh, è possibile fare riferimento a /unix/128559/solving-mv-argument-list-too-long


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. Quale risposta ti riferisci come "risposta più dettagliata"?
— Ramhound,

Questo in realtà non risponde alla domanda poiché OP vuole spostare file diversi in directory diverse.
— DavidPostill
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.