10 votes

Pipe to mv command

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 ?

9voto

nohillside Points 82672

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.

1voto

Vladimir Botka Points 161

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.com

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.

Powered by:

X