Déplacer une plage de fichiers numérotés?

14

J'ai 291 fichiers numérotés (commençant à 001 - titre et se terminant à 291 - titre) qui doivent être déplacés dans des répertoires séparés. (001 à 021 dans le dossier 1, 022 à 053 dans le dossier 2, ils ne sont pas nécessairement le même nombre de fichiers à chaque fois).

Je me suis dit que je pouvais le faire de façon dégoûtante comme ceci: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Je suis presque certain qu'il y a une meilleure façon, alors que serait-ce?

EDIT: Donc, cela aurait bien fonctionné, mais je me souvenais ...

Je ne suis pas bloqué en utilisant un terminal, j'ai donc utilisé un gestionnaire de fichiers pour cliquer et faire glisser. La question demeure cependant.

Rob
la source
1
Vous voulez 21 sous-dossiers dans le dossier 1 et 22 dossiers dans le dossier 2?
Daniel Beck
Avez-vous évalué unix.SE? Il y a un bon sujet à ce sujet ici: unix.stackexchange.com/questions/12976/…
chrisjlee
@DanielBeck non, je veux que les fichiers soient déplacés dans chaque dossier. Il y a un nombre différent de fichiers dans chaque dossier.
Rob
@ ChrisJ.Lee C'est assez similaire à ce que je faisais / ai fait avant, j'aime ça. Étant donné que les fichiers correspondent à d'autres fichiers dans un autre dossier, j'ai pu ls -l | grep ^- | wc -lobtenir le nombre de lignes.
Rob
1
@Rob Right. Pourtant, un nombre différent de fichiers dans chaque répertoire. Automatiser cela (y compris les règles) demande plus d'efforts que de le faire vous-même plusieurs fois.
Daniel Beck

Réponses:

25

Puisque vous avez dit que ce n'était pas toujours exactement 21 fichiers, vous devez déplacer les fichiers manuellement, et pour le faire efficacement, vous pouvez utiliser l' extension d'accolade :

mv filename{001..21} dir1
mv filename{022..53} dir2
...
drrlvn
la source
On dirait que ça pourrait marcher, je vais l'essayer.
Rob
1
Cela fonctionne parfaitement si vous ajoutez un caractère générique après les crochets. C'est exactement ce dont j'avais besoin.
Rob
2
Si le nombre est au milieu du nom, vous pouvez écrire file{001..21}name, vous n'avez pas besoin d'utiliser de caractères génériques. Quoi qu'il en soit, heureux que cela fonctionne pour vous.
drrlvn
1

Cela déplacera les fichiers comme vous l'avez décrit (sauf que la deuxième plage serait de 022 à 042 pour les 21 seconds fichiers).

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
En pause jusqu'à nouvel ordre.
la source
Ce n'est pas toujours 21 fichiers, mais merci.
Rob
0

Ce que je veux dire, c'est de déplacer beaucoup de fichiers (comme des dizaines de milliers ou un million), le shell se plaindra de la liste des fichiers trop longtemps si vous utilisez simplement {1..20}, donc

Dans zsh , vous pouvez charger le module intégré mv :

setopt extended_glob zmodload

zsh / fichiers

après cela, vous pouvez utiliser une commande comme:

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

ou si vous écrivez des scripts shell, vous pouvez faire quelque chose comme ceci:

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

si vous n'utilisez pas zsh, vous pouvez vous référer à /unix/128559/solving-mv-argument-list-too-long

Arron Cao
la source
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change. À quelle réponse faites-vous référence en tant que «réponse plus détaillée»?
Ramhound
Cela ne répond pas vraiment à la question car OP souhaite déplacer différents fichiers vers différents répertoires.
DavidPostill