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.