J'ai beaucoup de fichiers dans un dossier, nommé comme 00802_Bla_Aquarium_XXXXX.jpg
. Maintenant, je dois copier chaque 4ème fichier dans un sous-dossier, en disant selected/
.
00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg
Comment puis-je faire cela?
ls
. Voir aussi stackoverflow.com/q/4553751/789593 qui pose des questions sur toutes les deux lignes.for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
Réponses:
Avec zsh, vous pourriez faire:
POSIXly, même idée, juste un peu plus verbeuse:
Étant donné que ces noms de fichiers ne contiennent aucun caractère vierge ou générique, vous pouvez également effectuer:
la source
for i do
est standard et en fait plus portable quefor i; do
et est la manière canonique de boucler sur les paramètres positionnels.En bash, une drôle de possibilité, qui fonctionnera plutôt bien ici:
C'est certainement la réponse la plus courte et la plus efficace: pas de sous-coque, pas de boucle, pas de tuyau, pas
awk
de processus externe de salle; juste une fourchette verscp
(que vous ne pouvez pas éviter de toute façon) et une expansion et un glob bash brace (dont vous pouvez vous débarrasser complètement puisque vous savez combien de fichiers vous avez).la source
cp 00802_Bla_Aquarium_*{03..99..4}.jpg selected
si vous le souhaitez3 mod 4
. (J'utilise le fait merveilleux que 100 est divisible par 4). Maintenant, à propos des fichiers numérotés en continu, toutes les autres réponses supposent la même chose.Simplement avec bash, vous pouvez faire:
Le modèle
./*.jpg
sera remplacé par une liste triée par ordre alphabétique des noms de fichiers, comme indiqué par l'homme bash, il devrait donc correspondre à votre objectif.la source
for
boucle peut être simplement remplacé par cette ligne:(((++n)%4)) || cp "$file" selected/
.;-)
. Le problème est que vous cherchez un fichiercp
pour chaque fichier, ce qui n'est pas vraiment efficace.Si vous avez
ruby
installé, vous pouvez utiliser la doublure suivante. Notez qu'il suppose que le répertoire sélectionné existe.Il prend une liste de tous les fichiers avec l'extension .jpg dans le répertoire courant et le découpe en listes de quatre éléments et copie le premier élément de chacune de ces listes dans le répertoire sélectionné dans le répertoire courant.
la source
Si vous savez que vous n'aurez pas de retour à la ligne dans vos noms de fichiers, vous pouvez utiliser:
la source
Vous pouvez utiliser un gestionnaire de fichiers GUI et redimensionner la bordure de la fenêtre jusqu'à ce que tous les 5 fichiers occupent une ligne, puis utilisez la souris pour sélectionner la première colonne ...
la source
En regardant stackoverflow.com/q/4553751/789593 qui offre une solution pour copier chaque seconde comme @NN l'a mentionné, une solution très simple serait:
Il peut ne pas être très efficace car il nécessite un bit d'étape de copie supplémentaire, il devrait être très facile à faire.
la source