439 votes

Faire en sorte que xargs exécute la commande une fois pour chaque ligne d'entrée

Comment puis-je faire en sorte que xargs exécute la commande exactement une fois pour chaque ligne d'entrée donnée ? Le comportement par défaut de xargs est de découper les lignes et d'exécuter la commande une fois, en passant plusieurs lignes à chaque instance.

Desde http://en.wikipedia.org/wiki/Xargs :

find /path -type f -print0 | xargs -0 rm

Dans cet exemple, find alimente l'entrée de xargs avec une longue liste de noms de fichiers. xargs divise ensuite cette liste en sous-listes et appelle rm une fois pour chaque sous-liste. Ceci est plus efficace que cette version fonctionnellement équivalente :

find /path -type f -exec rm '{}' \ ;

Je sais que find a le drapeau "exec". Je ne fais que citer un exemple illustratif tiré d'une autre ressource.

5 votes

Dans l'exemple que vous donnez, find /path -type f -delete serait encore plus efficace :)

0 votes

Essayez de ne pas utiliser xargs...

7 votes

OP, je sais que cette question est très ancienne, mais elle apparaît toujours sur Google et, à mon avis, la réponse acceptée est fausse. Voir ma réponse plus longue ci-dessous.

0voto

CrashNeb Points 190

Il semble que je n'ai pas assez de réputation pour ajouter un commentaire à Réponse de Tobia ci-dessus J'ai donc ajouté cette "réponse" pour aider ceux d'entre nous qui veulent expérimenter avec la technologie de l'eau. xargs de la même manière sur les plateformes Windows.

Voici un fichier batch Windows qui fait la même chose que le "show" script rapidement codé de Tobia :

@echo off
REM
REM  cool trick of using "set" to echo without new line
REM  (from:  http://www.psteiner.com/2012/05/windows-batch-echo-without-new-line.html)
REM
if "%~1" == "" (
    exit /b
)

<nul set /p=Args:  "%~1"
shift

:start
if not "%~1" == "" (
    <nul set /p=, "%~1"
    shift
    goto start
)
echo.

-3voto

Sherm Pendley Points 10822

Dans votre exemple, l'intérêt de transférer la sortie de find vers xargs est que le comportement standard de l'option -exec de find est d'exécuter la commande une fois pour chaque fichier trouvé. Si vous utilisez find, et que vous voulez son comportement standard, alors la réponse est simple - n'utilisez pas xargs pour commencer.

0 votes

En fait, ce que je peux sous-entend des modifications apportées par le PO est que les données d'entrée n'ont rien à voir avec find et c'est la raison pour laquelle ils ne préfèrent pas la -exec opción.

-3voto

sergiofbsilva Points 846

Exécuter la tâche ant clean-all sur chaque build.xml du dossier courant ou d'un sous-dossier.

find . -name 'build.xml' -exec ant -f {} clean-all \;

0 votes

Tout le monde n'a pas ant installé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X