Comment déplacer les premiers fichiers x

21

J'ai cet énorme dossier avec des milliers de fichiers non ordonnés. Est-il possible de déplacer les premiers 5000 vers un sous-dossier via la mvcommande? Pour l'instant je déplace des fichiers avec

 mv *some_pattern* ./subfolder1/

Pour l'instant, je déplace les images de manière assez aléatoire, ce n'est pas vraiment important s'il n'y a pas exactement 5000 fichiers dans chaque sous-dossier. Y a-t-il une meilleure façon de le faire?

Fabinout
la source

Réponses:

23
mv `ls | head -500` ./subfolder1/
Schaiba
la source
12
(en supposant qu'aucun des noms de fichiers ne contienne d'espace, tabulation, nouvelle ligne, étoile, crochet ouvert, caractères de point d'interrogation ou commence par -ou .et en supposant qu'il subfolder1n'apparaît pas dans cette liste.)
Stéphane Chazelas
@ StéphaneChazelas si le fichier en contient, comment modifier la commande?
Peiti Li
$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas
15

Avec zsh:

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

Pour déplacer jusqu'à 5000 fichiers normaux dans l'ordre où ils se trouvent dans le répertoire.

Pour les 5000 premiers de la liste triée lexicographiquement:

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

Si vous obtenez une erreur concernant la liste d'arguments trop longue . Vous pouvez utiliser zshla mvcommande buitin de en émettant:

zmodload zsh/files

premier.

POSIX:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
Stéphane Chazelas
la source
2
L'extrait de POSIX est un joyau
iruvar
que faire si j'obtiens l'erreur en utilisant bash?
Brian Thomas
8

Une version simple qui prend en charge des caractères spéciaux, des espaces, etc.

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

Pour que cela fonctionne tel dir2quel, il doit exister et vous devez l'exécuter à partir du répertoire parent de dir1et dir2.

Cela déplacera 1000 fichiers de dir1 à dir2.

Luis Antolín Cano
la source
joli! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ pour déplacer 1000 plus gros fichiers dans dir1 (-S répertorie les fichiers par taille)
oneklc
1
Notez que ls -Qcela ne produit pas une sortie compatible avec xargsle format d'entrée attendu de. Il est utile pour les noms de fichiers contenant des caractères d'espace, mais pas pour les guillemets doubles ou les barres obliques inverses et nuit aux noms de fichiers contenant des caractères de contrôle, y compris TAB.
Stéphane Chazelas
3

Vous devrez peut-être faire quelque chose comme ceci:

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

Ce script fonctionne avec bash, ksh, sh et plusieurs variantes UNIX.

Karlson
la source
1
(à condition qu'aucun des noms de fichiers ne contienne d'espace, de tabulation, de nouvelle ligne, d'étoile, de crochet, de point d'interrogation ou ne commence par - ou. et à condition qu'il destinationn'apparaisse pas dans cette liste.)
Stéphane Chazelas
@StephaneChazelas True. Ce n'est pas une solution complète, juste une méthode pour résoudre le problème.
Karlson
3
  1. Aller au répertoire dont vous souhaitez déplacer les fichiers
  2. exécuter sous la commande

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

Dans la findcommande, .(point) désigne le répertoire courant

trouve les fichiers qui commencent par Hello et se terminent par gz, les 5000 premiers fichiers seront déplacés vers le chemin /data01/path/

Pratik Hiremath
la source
1

J'ai réussi à faire un mouvement de 50 000 sans l'erreur mv bash comme celle-ci

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

Assez drôle, c'était sur un partage samba, donc la limite de 50k est parce que l'interface graphique de l'Explorateur Windows n'aime pas plus de 60k fichiers dans un répertoire en général.

Brian Thomas
la source