Diviser un dossier en plusieurs sous-dossiers dans le terminal/script bash
J'ai plusieurs dossiers, chacun avec entre 15 000 et 40 000 photos. Je veux que chacun de ces être divisé en sous-dossiers, - chacune avec 2 000 fichiers en eux.
Ce qui est une façon rapide de le faire ce qui permettra de créer chaque dossier dont j'ai besoin sur la route et de déplacer tous les fichiers?
Actuellement, je ne peux que trouver comment déplacer les x premiers éléments d'un dossier dans un pre-répertoire existant. Afin d'utiliser cette fonction sur un dossier avec 20 000 articles... j'aurais besoin de créer des 10 dossiers manuellement, et exécutez la commande de 10 fois.
ls -1 | sort -n | head -2000| xargs -i mv "{}" /folder/
J'ai essayé de le mettre dans une boucle for, mais j'ai du mal à l'obtenir à faire des dossiers correctement avec mkdir. Même après que je me déplace, j'ai besoin du programme pour ne créer des dossiers pour chaque 20e fichier (début d'un nouveau groupe). Il veut faire un nouveau dossier pour chaque fichier.
Donc... comment puis-je déplacer facilement à un grand nombre de fichiers dans des dossiers d'un nombre arbitraire de fichiers dans chacun d'eux?
Toute aide serait très bien... et bien... utile!
Vous devez vous connecter pour publier un commentaire.
Cette solution permet de gérer les noms avec des espaces et des caractères génériques et peuvent être facilement étendu pour prendre en charge moins simple structure d'arbre. Il va chercher les fichiers dans tous les sous-répertoires du répertoire de travail et de les trier dans de nouveaux sous-répertoires de ceux-ci. De nouveaux répertoires seront nommés
0
,1
, etc.:La
find -print0
/read
combinaison avec des processus de substitution a été volé une autre question.Il convient de noter que la simple expansion peut traiter toutes sortes d'étranges noms de fichiers et répertoires ainsi. Il n'est cependant pas facilement extensible pour plusieurs niveaux de répertoires.
Essayer quelque chose comme cela:
Pleine version du script:
Pour les nuls:
vim split_files.sh
dir_size
etdir_name
valeurs pour correspondre à vos désirsdir_name
un numéro est ajoutécd my_folder
sh ../split_files.sh
for i in `seq 1 10`; do mkdir -p "folder$i/irr"; find . -maxdepth 2 -type f | head -n 4000 | xargs -i mv "{}" "folder$i/irr"; done
find . -maxdepth 1 -type f | head -n $dir_size |xargs -J {} mv {} "$dir_name$i"
Le code ci-dessous suppose que les noms de fichiers ne contiennent pas de sauts de ligne, des espaces, des tabulations, des apostrophes, guillemets, ou des barres obliques inverses, et que les noms de fichier ne commence pas par un tiret. Il suppose également que
IFS
n'a pas été modifié, car il utilisewhile read
au lieu dewhile IFS= read
, et parce que les variables ne sont pas cotés. Ajoutersetopt shwordsplit
dans Zsh.Le code ci-dessous suppose que les noms de fichiers ne contiennent pas de sauts de ligne et de ne pas commencer par un tiret.
-n2000
prend 2000 arguments à la fois et{#}
est le numéro de séquence de l'emploi. Remplacer{#}
avec'{=$_=sprintf("%04d",$job->seq())=}'
pour remplir les numéros à quatre chiffres.La commande ci-dessous suppose que les noms de fichiers ne contiennent pas de sauts de ligne. Il utilise la mise en œuvre de
rename
par Aristote Pagaltzis qui est lerename
formule dans Homebrew, où-p
est nécessaire de créer des répertoires, où--stdin
est nécessaire pour obtenir les chemins à partir de STDIN, et où$N
est le numéro du fichier. Dans d'autres implémentations vous pouvez utiliser$.
ou++$::i
au lieu de$N
.ls
livré avec un lot de problèmes. J'ai adapté votre exemple un peu:find . -type f -print0|parallel -0 -n2000 mkdir "dir_{#}"\;mv {} "dir_{#}"
. Fonctionne aussi très bien pour moi.ls
(comme busyboxls
) qui remplace des caractères dans les noms de fichiers avec des points d'interrogation, même si la sortie n'est pas à un terminal.Je voudrais aller avec quelque chose comme ceci:
$n -eq 2000
être$n -eq 1999
depuis le début est basé sur zéro? Peu importe, j'aime bien cette solution, merci.Cette solution a fonctionné pour moi sur MacOS:
Il crée des sous-dossiers de 100 éléments.
Vous aurez certainement à écrire un script pour ça.
Conseils de choses à inclure dans votre script:
D'abord compter le nombre de fichiers dans votre répertoire source
Diviser ce nombre par 2000 et ajouter 1, pour déterminer le nombre de répertoires à créer
Enfin parcourir vos fichiers et de les déplacer à travers les sous-dossiers.
Vous devrez utiliser deux boucles imbriquées : l'un pour choisir et créer le répertoire de destination, l'autre pour déplacer 2000 fichiers dans ce sous répertoire, puis de créer, à côté des subdir et passer au 2000 fichiers de la nouvelle, etc...
La réponse ci-dessus est très utile, mais il est très import point dans Mac(10.13.6) à la borne. Parce que xargs "-i" l'argument n'est pas disponible, j'ai changer la commande du haut vers le bas.
ls -1 | sort -n | head -2000| xargs -I '{}' mv {} /folder/
Ensuite, j'utilise le ci-dessous script shell(référence tmp réponse)
C'est un tweak de Marque Setchell de
Utilisation: bash splitfiles.bash $PWD/directoryoffiles splitsize
Il ne nécessite pas le script pour être situé dans le même dir que les fichiers pour le partage de l', il fonctionnera sur tous les fichiers, et pas seulement l' .jpg et vous permet de spécifier la taille du segment comme un argument.