Commande Bash pour ne déplacer que certains fichiers?

Disons que j’ai les fichiers suivants dans mon répertoire actuel:

1.jpg 1original.jpg 2.jpg 2original.jpg 3.jpg 4.jpg 

Existe-t-il une commande terminal / bash / linux capable de faire quelque chose comme

 if the file [an integer]original.jpg exists, then move [an integer].jpg and [an integer]original.jpg to another directory. 

En exécutant une telle commande, 1.jpg, 1original.jpg, 2.jpg et 2original.jpg seront dans leur propre répertoire.

REMARQUE Cela ne doit pas nécessairement être une commande. Je peux être une combinaison de commandes simples. Peut-être que quelque chose comme copier des fichiers originaux dans un nouveau répertoire. Faites ensuite un filtre d’expression régulière sur les fichiers du newdir pour obtenir une liste des noms de fichiers de l’ancien répertoire qui doivent encore être copiés, etc.

Activer la prise en charge de glob étendu vous permettra d’écrire un modèle de type expression régulière. Cela peut gérer des fichiers avec des entiers à plusieurs chiffres, tels que «87 .jpg» et «87original.jpg». L’extension du paramètre Bash peut alors être utilisée pour supprimer “original” du nom d’un fichier trouvé afin de vous permettre de déplacer les deux fichiers associés.

 shopt -s extglob for f in +([[:digit:]])original.jpg; do mv $f ${f/original/} otherDirectory done 

Dans un modèle étendu, +( x ) correspond à une ou plusieurs des choses entre parenthèses, analogues à l’expression régulière x+ . Ici, x est un chiffre quelconque. Par conséquent, nous faisons correspondre tous les fichiers du répertoire en cours dont le nom est composé d’au moins un chiffre suivi de “original.jpg”.

${f/original/} est un exemple de substitution de motif de bash . Il supprime la première occurrence de la chaîne “original” de la valeur de f . Donc, si f est la chaîne “1original.jpg”, alors ${f/original/} est la chaîne “1.jpg”.

bien, pas directement, mais c’est un oniner (edit: plus maintenant):

 for i in [0-9].jpg; do orig=${i%.*}original.jpg [ -f $orig ] && mv $i $orig another_dir/ done 

edit: je devrais probablement signaler ma solution:

  • for i in [0-9].jpg : exécute le corps de la boucle pour chaque fichier jpg avec un seul numéro comme nom de fichier. stocker le nom de fichier entier dans $i
  • orig={i%.*}original.jpg : enregistrer dans $orig le nom de fichier possible pour le “fichier original”
  • [ -f $orig ] : vérifiez via le test(1) (les éléments [ ... ] ) si le fichier original pour $i existe. Si oui, déplacez les deux fichiers sur another_dir . cela se fait via && : la partie après elle sera seulement exécutée si le test a réussi.

Cela devrait fonctionner pour n’importe quel préfixe ssortingctement numérique, par exemple 234.jpg

 for f in *original.jpg; do pre=${f%original.jpg} if [[ -e "$pre.jpg" && "$pre" -eq "$pre" ]] 2>/dev/null; then mv "$f" "$pre.jpg" targetDir fi done 

"$pre" -eq "$pre" donne une erreur si ce n’est un entier

MODIFIER:
Cela échoue s’il existe des fichiers original.jpg et .jpg .
$pre est alors nullssortingng et "$pre" -eq "$pre" est vrai.

Ce qui suit fonctionne et est facile à comprendre (remplacez par le répertoire de sortie et {1..9} par la plage réelle de vos chiffres.

 for x in {1..9} do if [ -e ${x}original.jpg ] then mv $x.jpg out mv ${x}original.jpg out fi done 

Vous pouvez évidemment aussi le saisir en une seule ligne.

Vous pouvez utiliser des instructions Regex pour rechercher des “correspondances” dans les noms de fichiers que vous consultez. Ensuite, effectuez vos actions sur les “correspondances” que vous trouvez.

integer=0; while [ $integer -le 9 ] ; do if [ -e ${integer}original.jpg ] ; then mv -vi ${integer}.jpg ${integer}original.jpg lol/ ; fi ; integer=$[ $integer + 1 ] ; done

Notez qu’ici, “lol” est le répertoire de destination. Vous pouvez le changer pour tout ce que vous voulez. En outre, vous pouvez changer le 9 while [ $integer -le 9 ] en vérifiant les entiers supérieurs à 9. En ce moment, il commence à 0 * et s’arrête après avoir vérifié 9 *.

Edit: Si vous le souhaitez, vous pouvez remplacer les points-virgules dans mon code par des retours chariot, ce qui peut être plus facile à lire. En outre, vous pouvez coller le bloc entier dans le terminal de cette façon, même si cela n’est pas immédiatement évident.