Come spostare i primi file x


21

Ho questa enorme cartella con migliaia di file non ordinati. È possibile spostare i primi 5000 in una sottocartella tramite il mvcomando? Per ora sposto i file con

 mv *some_pattern* ./subfolder1/

Per ora, sposto le immagini in modo abbastanza casuale, non è molto importante se non ci sono esattamente 5000 file in ogni sottocartella. C'è un modo migliore per farlo?


Risposte:


23
mv `ls | head -500` ./subfolder1/

12
(supponendo che nessuno dei nomi di file contenga spazio, tabulazione, nuova riga, stella, parentesi quadra aperta, caratteri del punto interrogativo o inizi con -o .e supponendo che subfolder1non venga visualizzato in tale elenco.)
Stéphane Chazelas

@ StéphaneChazelas se il file contiene quelli, come possiamo modificare il comando?
Peiti Li,

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas,

15

Con zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

Per spostare fino a 5000 file regolari nell'ordine in cui si trovano nella directory.

Per i primi 5000 nell'elenco lessicograficamente ordinato:

mv -- *(D.[1,5000]) ./subfolder1

Se ricevi un errore sull'elenco arg troppo a lungo . Puoi usare zshil mvcomando buitin emettendo:

zmodload zsh/files

primo.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
Lo snippet POSIX è un gioiello
iruvar il

cosa succede se viene visualizzato l'errore utilizzando bash?
Brian Thomas,

8

Una versione semplice che supporta caratteri speciali, spazi, ecc.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

Perché questo funzioni così com'è dir2deve esistere e devi eseguirlo dalla directory padre di dir1e dir2.

Questo sposterà 1000 file da dir1 a dir2.


Ben fatto! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ per spostare 1000 file più grandi in dir1 (-S elenca i file per dimensione)
oneklc

1
Si noti che ls -Qnon produce un output compatibile con xargsil formato di input previsto. Aiuta a nomi di file contenenti caratteri spaziali, ma non a virgolette doppie o barre rovesciate e danneggia i nomi di file contenenti caratteri di controllo, incluso TAB.
Stéphane Chazelas,

3

Potrebbe essere necessario fare qualcosa del genere:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

Questo script funziona in bash, ksh, sh e più varianti UNIX.


1
(a condizione che nessuno dei nomi dei file contenga spazio, tabulazione, nuova riga, stella, parentesi quadra aperta, caratteri del punto interrogativo o inizi con - o. e fornito destinationse stesso non compare in tale elenco.)
Stéphane Chazelas

@StephaneChazelas True. Questa non è una soluzione completa, ma solo un metodo per affrontare il problema.
Karlson,

3
  1. Vai alla directory da cui vuoi spostare i file
  2. corri sotto il comando

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

Nel findcomando, .(punto) indica la directory corrente

trova i file che iniziano con Hello e finiscono con gz, i primi 5000 file verranno spostati nel percorso /data01/path/


1

Sono stato in grado di fare con successo una mossa di 50.000 senza l'errore mv bash come questo

 ls | head -50000 | xargs -I{} sudo mv {} 01/

Abbastanza divertente, questo era su una condivisione samba, quindi il limite di 50k è perché la GUI di Windows Explorer non ama più di 60k file in una directory in generale.

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.