J'essaie de déplacer des fichiers à partir du terminal, mais uniquement ceux qui proviennent des résultats d'un grep
requête.
ls -l | grep -i s02 | mv
Quelle est la meilleure façon d'exécuter la commande ci-dessus ?
J'essaie de déplacer des fichiers à partir du terminal, mais uniquement ceux qui proviennent des résultats d'un grep
requête.
ls -l | grep -i s02 | mv
Quelle est la meilleure façon d'exécuter la commande ci-dessus ?
Pour ce faire, il suffit de lancer
cd directory/containing/the/files
mv *[sS]02* /path/to/target/
Pour les opérations plus complexes, il est également possible d'utiliser l'option find
pour trouver tous les fichiers pertinents. L'exemple de votre question pourrait également être écrit comme suit
cd directory/containing/the/files
find . -type f -maxdepth 1 -iname '*s02*' -exec mv {} /path/to/target/directory/ \;
Cela vaut la peine de jeter un coup d'œil à man find
pour voir quelles autres options sont disponibles.
Par exemple avec bash. Étant donné les fichiers ci-dessous
$ ls -1
test1
test2
test3
1) Pour éviter les surprises, regardons d'abord les commandes
$ for i in test*; do echo mv $i $i.ext; done
mv test1 test1.ext
mv test2 test2.ext
mv test3 test3.ext
et exécuter les commandes si c'est ce que nous voulons
$ for i in test*; do mv $i $i.ext; done
$ ls -1
test1.ext
test2.ext
test3.ext
Adaptez le parcours à vos besoins.
2) Il est possible d'utiliser sed y xargs . Testons-le d'abord
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 printf "%s %s\n"
test2 test_2
test1 test_1
test3 test_3
et exécuter les commandes si c'est ce que nous voulons
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 mv
$ ls -1
test_1
test_2
test_3
Espaces dans le nom du fichier
Ces scripts ne fonctionneront pas comme prévu si les noms de fichiers comportent des espaces. Dans Unix, l'espace est utilisé comme séparateur. Par exemple avec les fichiers
$ ls -1
test 1
test 2
test 3
il est clair que les commandes ci-dessous ne peuvent pas fonctionner comme prévu
$ for i in test*; do echo mv $i $i.ext; done
mv test 1 test 1.ext
mv test 2 test 2.ext
mv test 3 test 3.ext
La solution consiste à exclure l'espace de la liste des séparateurs.
$ IFS="`printf '\n\t'`"
et le faire précéder des commandes qui doivent traiter les noms de fichiers avec des espaces. La commande ci-dessous
$ IFS="`printf '\n\t'`"; for i in test*; do mv $i $i.ext; done
fonctionne comme prévu
$ ls -1
test 1.ext
test 2.ext
test 3.ext
L'option suivante est la citation des arguments
for i in test*; do mv "$i" "$i.ext"; done
De cette façon, il est possible d'utiliser la riche variété de filtres Unix et d'éviter la limitation à la construction "find ... -exec ... {}". Pour d'autres limitations, voir les notes sous la ligne.
Notes sur MacOS
1) Citation de opengroup.org - Standard de produit : Commandes et utilitaires V4
1.4.21 sh
Question 31 : La variable d'environnement IFS est-elle ignorée lorsque le shell est invoqué ?
Réponse : Oui
Justification : La spécification permet à la commande sh d'ignorer le paramétrage de la variable d'environnement IFS lors de son invocation. Le paramétrage de cette variable a été utilisé pour enfreindre la sécurité sur des systèmes qui utilisent le shell pour interpréter un appel aux interfaces system() et execvp().
Référence : Norme technique, Shell et Utilitaires, Numéro 6, Chapitre 4, Utilitaires, sh, ENVIRONMENT VARIABLES, IFS.
2) Citation de developer.apple.com - Entrée et sortie du shell
Vous pouvez modifier le comportement de la commande read en modifiant la variable shell IFS (abréviation de internal field separators). Le comportement par défaut consiste à séparer les entrées partout où il y a un espace, une tabulation ou une nouvelle ligne. En modifiant cette variable, ...
3) Citation de developer.apple.com - Déclarations de contrôle de base - Standard pour les boucles
Dans l'exemple suivant, la liste est *.JPG ...
#!/bin/sh
for i in *.JPG ; do
mv "$i" "$(echo $i | sed 's/\.JPG$/.x/')"
mv "$(echo $i | sed 's/\.JPG$/.x/')" "$(echo $i | sed 's/\.JPG$/.jpg/')"
done
Ces scripts peuvent ne pas fonctionner comme prévu s'il y a des caractères spéciaux dans le nom du fichier. Remplacez d'abord ces caractères. Voir Comment supprimer un caractère spécial . Il existe des dizaines d'articles sur la façon de renommer des fichiers avec des espaces et d'autres caractères qui posent problème, par exemple. Noms de fichiers avec des espaces rompant pour la boucle, commande find . C'est une bonne idée de se débarrasser de ces caractères et de traduire les noms de fichiers dans le format que vous préférez (par ex. renommer-fichier ) avant de les traiter dans *nix. Voir Correction des noms de fichiers Unix/Linux/POSIX .
LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.