Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

xargs et noms de fichiers complexes

27 réponses
Avatar
Adrien
Bonjour,

Je cherche à déplacer tous les fichiers contenant une extention .doc dans un
répertoire unique mais il y a des fichiers avec des noms disons complexes,
qui contiennent apostrophes, espaces, tirets et que sais-je encore. J'ai
essayé la commande suivante:

find . -type f | grep '\.doc' | xargs -i -t mv {} /backup/doc_word/

J'ai la réponse suivante :
xargs: Le paramètre simple n'est pas repérable par apostrophe.

Que faut-il rajouter à cette ligne de commande pour terminer l'opération ?

NB: je suis prêt à sacrifier les caractères non valides des fichiers pour la
bonne cause et les remplacer par des '_ ', à condition que cela soit
automatique...

Merci d'avance.
Adrien

10 réponses

1 2 3
Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 13:05, Adrien a tapoté :
| Bonjour,

Bonjour.


| Je cherche à déplacer tous les fichiers contenant une extention .doc dans un
| répertoire unique mais il y a des fichiers avec des noms disons complexes,
| qui contiennent apostrophes, espaces, tirets et que sais-je encore. J'ai
| essayé la commande suivante:
|
| find . -type f | grep '.doc' | xargs -i -t mv {} /backup/doc_word/

Erk.


| J'ai la réponse suivante :
| xargs: Le paramètre simple n'est pas repérable par apostrophe.

Ah.


| Que faut-il rajouter à cette ligne de commande pour terminer l'opération ?

find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;


| Merci d'avance.

'plaisir.


Thomas
--
Les choses me paraissent parfaitement claires en ce qui concerne le
nom du groupe et les autres sujets qui ne sont évoqués que pour faire
sentir aux mouches la douceur des dolomites.
-+- MZ in: Guide du Cabaliste Usenet - La Cabale glisse dans la piscine -+-
Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 13:27, a tapoté :
| Selon Thomas Nemeth dans <3fb767cb$0$4495$ :
|
| > find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;
|
| c'est pas plûtot
| find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;

Non, c'est du file globing, pas des expressions rationnelles.
Extrait de la page man de find :
-name pattern
Base of file name (the path with the leading direc­
tories removed) matches shell pattern pattern. The
metacharacters (`*', `?', and `[]') do not match a
`.' at the start of the base name. To ignore a
directory and the files under it, use -prune; see
an example in the description of -path.

Comme on peut le lire, c'est : « shell pattern ».


Thomas
--
MB: Chez moi, on voussoie les gens qu'on ne connaît pas, d'abord.
JM: C'est parce que tu as un truc qu'il faudrait enlever d'entre
tes fesses.
-+- Guide du Cabaliste Usenet - Rudiments de netiquette -+-
Avatar
Stephane Chazelas
2003/11/16, 13:27(+01), :
[...]
find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;


c'est pas plûtot
find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;


Non, c'est plutot:

mv ./**/*.doc(D.) /backup/doc_word

(À moins que vous n'utilisiez pas zsh bien sûr).

Ce qui est après "-name" n'est pas une regexp, le "." n'est pas
spécial, inutile de l'escaper.

mmv ';*.doc' /backup/doc_word

ou

find . -type f ( -name '*.doc' -o -name '.*.doc' -o
-name '.doc' ) -print0 |
xargs -r0 bash -c 'mv "$@" /backup/doc_word' z

Pour les malchanceux qui n'ont pas accès à zsh.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 17:35, Stephane Chazelas a tapoté :
| 2003/11/16, 13:27(+01), :
| [...]
| >> find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;
| >
| > c'est pas plûtot
| > find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;
|
| Non, c'est plutot:
|
| mv ./**/*.doc(D.) /backup/doc_word
|
| (À moins que vous n'utilisiez pas zsh bien sûr).

Ce qui n'est pas le cas de la majorité des débutants Linux. Moi même
je pense laisser tomber zsh pour revenir à bash tellement c'est
lourd et les fonctionnalités qu'il propose redondantes/inutiles :)


| find . -type f ( -name '*.doc' -o -name '.*.doc' -o
| -name '.doc' ) -print0 |
| xargs -r0 bash -c 'mv "$@" /backup/doc_word' z
|
| Pour les malchanceux qui n'ont pas accès à zsh.

Pourquoi faire simple quand on peut faire compliqué :)
C'est digne des shadoks, ça, Stéphane ;)


Thomas
--
D'ailleurs, c'est pour ça que Corel arrète Linux.
Leurs avocats ont compris la GNU ?

Ils sont venus, ils ont vu, ils l'ont pris dans le GNU.

-+- OP in Guide du Fmblien Assassin : "Et mon GNU, tu l'as vu ?" -+-


Avatar
Stephane Chazelas
2003/11/16, 16:40(+00), Thomas Nemeth:
[...]
Ce qui n'est pas le cas de la majorité des débutants Linux. Moi même
je pense laisser tomber zsh pour revenir à bash tellement c'est
lourd et les fonctionnalités qu'il propose redondantes/inutiles :)


Je ne tomberai pas dans le troll tellement il est évident que
ces trois lignes défient totalement la raison.

| find . -type f ( -name '*.doc' -o -name '.*.doc' -o
| -name '.doc' ) -print0 |
| xargs -r0 bash -c 'mv "$@" /backup/doc_word' z
|
| Pour les malchanceux qui n'ont pas accès à zsh.

Pourquoi faire simple quand on peut faire compliqué :)
C'est digne des shadoks, ça, Stéphane ;)


Oui mais,
find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;

oublie une partie du travail (les dotfiles), déplacerait aussi
des répertoires (ce qui pourrait avoir des conséquences
facheuses [l'avantage, c'est que du coup, ça déplacerait les
".*.doc" qui sont dedans...]), et exécute une instance de "mv"
par fichier, ce qui est loin d'être optimal.

Sans compter que (et c'est le cas aussi pour la solution zsh, on
préfèrera alors son zmv) on risque l'écrasement de fichiers.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 17:59, Stephane Chazelas a tapoté :
| 2003/11/16, 16:40(+00), Thomas Nemeth:
| [...]
| > Ce qui n'est pas le cas de la majorité des débutants Linux. Moi même
| > je pense laisser tomber zsh pour revenir à bash tellement c'est
| > lourd et les fonctionnalités qu'il propose redondantes/inutiles :)
|
| Je ne tomberai pas dans le troll tellement il est évident que
| ces trois lignes défient totalement la raison.

Hum :)
De totues façons je préfère tcsh ;)


| >| find . -type f ( -name '*.doc' -o -name '.*.doc' -o
| >| -name '.doc' ) -print0 |
| >| xargs -r0 bash -c 'mv "$@" /backup/doc_word' z
| >|
| >| Pour les malchanceux qui n'ont pas accès à zsh.
| >
| > Pourquoi faire simple quand on peut faire compliqué :)
| > C'est digne des shadoks, ça, Stéphane ;)
|
| Oui mais,
| find . -name "*.doc" -exec mv "{}" /backup/doc_word/ ;
|
| oublie une partie du travail (les dotfiles), déplacerait aussi

On ne met pas des .doc en dotfile. De toutes façons on ne fait
pas de .doc de manière générale, donc cette ligne de commande
n'a aucun sens ;)


| des répertoires (ce qui pourrait avoir des conséquences

-type f


Thomas
--
Si je dérange trop, faut pas hésiter à me le dire, je le prends juste
super mal et je vais martyriseer des pauves mouches sur fufe poru me
venger (parce que ma vengeance sera terrible, HAHAHAHA).
-+- RG in GFA : La vengence du serpent à plumes... -+-
Avatar
Stephane Chazelas
2003/11/16, 17:37(+00), Thomas Nemeth:
[...]
De totues façons je préfère tcsh ;)


C'est déjà un peu mieux que bash pour une utilisation
intéractive (enfin, c'est peut-être un peu moins vrai
aujourd'hui). bash et zsh lui doivent beaucoup d'ailleurs.

Bon, c'est vrai qu'il est inutilisable pour les scripts et qu'il
reprend pas mal de bugs de csh. Grace à zsh qui a repris toutes
ses fonctionnalités intéressantes, il devrait heureusement
bientôt tomber dans l'oubli (quand ses derniers utilisateurs
auront définitivement renoncé à toucher un clavier d'ordinateur).

| >| find . -type f ( -name '*.doc' -o -name '.*.doc' -o
| >| -name '.doc' ) -print0 |
| >| xargs -r0 bash -c 'mv "$@" /backup/doc_word' z
[...]

On ne met pas des .doc en dotfile. De toutes façons on ne fait
pas de .doc de manière générale, donc cette ligne de commande
n'a aucun sens ;)


La honte peut éventuellement conduire à vouloir les cacher sous
forme de dotfile. Ensuite, on peut vouloir les déplacer dans une
corbeille ; "/backup/doc_word", c'est juste peut-etre un peu
misleading comme nom de répertoire poubelle...

| des répertoires (ce qui pourrait avoir des conséquences

-type f


Oui, c'est keskeujdisais.

J'ai oublié de donner la solution zmv (zsh) :

autoload -U zmv
# (au cas où ce ne soit pas déjà dans le ~/.zshrc)

zmv -Q '(**/)(*.doc)(.D)' '/junk/$2'

(zmv est une fonction zsh, la doc est dans son fichier de
définition, voir ${^fpath}/zmv(N), et ne soyez pas trop effrayés
par le "To get the full power of it, you need a postgraduate
degree in zsh" ;)

Pour les postgraduated, on peut faire un truc qui déplace
bar/a.doc en /junk/a.doc, foo/a.doc en /junk/a.doc.1 par:

typeset -A n; n=()
zmv -Q '(**/)(*.doc)(.D)' '/junk/$2${n[$2]+.$n[$2]}${$((n[$2]++))+}'

Bien sûr, on peut faire aussi plus simple plus long comme en
bash (enfin en plus fiable et lisible qu'en bash quand-même).

(notez que zmv n'est pas exempt de bugs...).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 19:49, Stephane Chazelas a tapoté :
| 2003/11/16, 17:37(+00), Thomas Nemeth:
| [...]
| > De totues façons je préfère tcsh ;)
|
| C'est déjà un peu mieux que bash pour une utilisation
| intéractive (enfin, c'est peut-être un peu moins vrai
| aujourd'hui). bash et zsh lui doivent beaucoup d'ailleurs.

Oui.
Sauf que dans les version récentes de bash, il y a enfin un
système de complétion programmable, seule chose qui lui manquait.
Faudra que je le teste dès que possible...

Bash est, ÀMHA, devenu un zsh sans les trucs inutiles qui
clignotent, bref un tcsh compatible bourne. La puissance et
la simplicité. Je reviendrais à bash dès que j'aurais du
temps pour me refaire une config à partir de mes config zsh
et tcsh.


| Bon, c'est vrai qu'il est inutilisable pour les scripts et qu'il

Pour les scripts en ligne de commande.
Pour le reste seuls les scripts sh posix sont valables quel que
soit le shell.


| reprend pas mal de bugs de csh. Grace à zsh qui a repris toutes
| ses fonctionnalités intéressantes, il devrait heureusement
| bientôt tomber dans l'oubli (quand ses derniers utilisateurs
| auront définitivement renoncé à toucher un clavier d'ordinateur).

Ça n'est pas demain la veille : il est plus léger et rapide que
zsh au login (pour ce dernier, si on veut utiliser ses super
fonctionnalités dlmkt il faut charger tout un tas de saloperies
qui en ralentissent grandement l'arrivée eu prompt.


| > On ne met pas des .doc en dotfile. De toutes façons on ne fait
| > pas de .doc de manière générale, donc cette ligne de commande
| > n'a aucun sens ;)
|
| La honte peut éventuellement conduire à vouloir les cacher sous
| forme de dotfile. Ensuite, on peut vouloir les déplacer dans une
| corbeille ; "/backup/doc_word", c'est juste peut-etre un peu
| misleading comme nom de répertoire poubelle...

Pas faux :)


| typeset -A n; n=()
| zmv -Q '(**/)(*.doc)(.D)' '/junk/$2${n[$2]+.$n[$2]}${$((n[$2]++))+}'

Beuèrk :)


Thomas
--
C'est très bien FreeBSD ... a part qu'il manque un swapoff quand meme :-D...
7 Go de swap, ca modifie la gestion du swap, et ca devient très agressif le
swap (il me swap slrn, le temps que je tapes avec vim presque).
-+- NLS in GFA : "Attention à la corrosion par le swap !" -+-
Avatar
Stephane Chazelas
2003/11/16, 19:14(+00), Thomas Nemeth:
[...]
Bash est, ÀMHA, devenu un zsh sans les trucs inutiles


Tu fais erreur. bash est encore des lieux derrières zsh en terme
de fonctionnalités. Ensuite, les fonctionnalités que tu
n'utilises pas de zsh (celles que tu qualifies d'inutiles) ont
des chances d'être dans un module et donc non chargées. bash est
monolithique.

clignotent, bref un tcsh compatible bourne.


bash n'est pas plus compatible Bourne que zsh. Alors que tcsh
a essayé de fixer certaines erreurs de design de csh, bash en a
ajouté à sh (enfin, il s'est surtout contenté de copier les
erreurs de ksh93). Il y a autant d'écarts entre bash et la norme
POSIX qu'entre le mode de compatibilité POSIX de zsh et POSIX.
Donc l'argument "compatibilité" ne tient pas trop.

La puissance et la simplicité.


Ni la puissance, ni la simplicité. zsh est beaucoup plus
user-friendly que bash. Le design de bash (copié sur ksh) est
une horreur, à montrer dans les cours de langage sur ce qu'il ne
faut pas faire. Tu pourras te référer à la discussion à
si tu veux
des détails sur ce que j'entends par là.

Je reviendrais à bash dès que j'aurais du temps pour me
refaire une config à partir de mes config zsh et tcsh.


Libre à toi.

| Bon, c'est vrai qu'il est inutilisable pour les scripts et qu'il

Pour les scripts en ligne de commande.
Pour le reste seuls les scripts sh posix sont valables quel que
soit le shell.


À peu près d'accord même si je n'écris jamais de scripts shells
à moins d'y être forcé.

[...]
Ça n'est pas demain la veille : il est plus léger et rapide que
zsh au login (pour ce dernier, si on veut utiliser ses super
fonctionnalités dlmkt il faut charger tout un tas de saloperies
qui en ralentissent grandement l'arrivée eu prompt.


À fonctionnalité égale il démarre aussi vite. Perso, je lance un
shell par session de login, je ne vois pas où est le problème
d'attendre 1/2 seconde de plus. De plus, rien ne t'oblige à
utiliser les fonctionnalités que tu appelles saloperies, ça n'a
pas de sens.

[...]
| typeset -A n; n=()
| zmv -Q '(**/)(*.doc)(.D)' '/junk/$2${n[$2]+.$n[$2]}${$((n[$2]++))+}'

Beuèrk :)


C'est pas fait pour être lu, c'est fait pour être tapé. zsh est
avant tout un shell interactif, la lisibilité du code est
secondaire, il est plus essentiel que sa syntaxe soit facile à
assimiler/retenir et rapide à taper.

Quand dans bash, tu tapes:

for i in $(seq 15); do printf '%bn' "$i"; done

en zsh tu tapes:

for i ({1..15}) print $i
ou
repeat 15 print $((++i))

ou
for i in $(seq 15); do printf '%bn' "$i"; done
si t'as envie, mais c'est plus long.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Thomas Nemeth
Le dim 16 nov 2003 à 22:12, Stephane Chazelas a tapoté :
| 2003/11/16, 19:14(+00), Thomas Nemeth:
| [...]
| > Bash est, ÀMHA, devenu un zsh sans les trucs inutiles
|
| Tu fais erreur. bash est encore des lieux derrières zsh en terme
| de fonctionnalités. Ensuite, les fonctionnalités que tu

Je ne dis pas que bash rattrape toutes les fonctionnalités de
zsh, bien au contraire, je suis parfaitement d'accord avec toi
sur ce point.


| n'utilises pas de zsh (celles que tu qualifies d'inutiles) ont
| des chances d'être dans un module et donc non chargées. bash est
| monolithique.

Malheureusement, la plus importante (pour moi), la complétion,
est dans un module zsh à part. Et elle prend du temps à charger,
même avec un dump :-(


| > La puissance et la simplicité.
|
| Ni la puissance, ni la simplicité. zsh est beaucoup plus
| user-friendly que bash.

Bof. Pas d'accord.


| > Ça n'est pas demain la veille : il est plus léger et rapide que
| > zsh au login (pour ce dernier, si on veut utiliser ses super
| > fonctionnalités dlmkt il faut charger tout un tas de saloperies
| > qui en ralentissent grandement l'arrivée eu prompt.
|
| À fonctionnalité égale il démarre aussi vite. Perso, je lance un

Ah non. En tout cas pas avec la complétion programmable :-(


| shell par session de login, je ne vois pas où est le problème
| d'attendre 1/2 seconde de plus. De plus, rien ne t'oblige à
| utiliser les fonctionnalités que tu appelles saloperies, ça n'a
| pas de sens.

C'est à dire que zftp et toussa, c'est pas vraiment indispensable
d'autant plus qu'on trouve tous les outils nécessaires déjà présents
sur le système. Certes, tu vas me dire, c'est plus mieux pratique et
facile avec zsh. Mais pour moi d'une part ça alourdi le shell (et la
trace mémoire, lorsqu'on a 48 Mo, on en prend soin) et d'autre part
ça fait double emploi.


| Quand dans bash, tu tapes:
|
| for i in $(seq 15); do printf '%bn' "$i"; done
|
| en zsh tu tapes:
|
| for i ({1..15}) print $i
| ou
| repeat 15 print $((++i))
|
| ou
| for i in $(seq 15); do printf '%bn' "$i"; done
| si t'as envie, mais c'est plus long.

Est-ce important ?
for i in `seq 15`; do echo $i ; done


Thomas
--
BOFH excuse #48:
Bad ether in the cables.
1 2 3