2009-11-04 6 views
5

Je voudrais savoir comment utiliser le contenu d'un fichier en tant qu'argument de ligne de commande, mais je suis aux prises avec la syntaxe.Utilisation du contenu du fichier comme arguments de ligne de commande dans BASH

Dire que j'ai les suivantes:

# cat > arglist 
src/file1 dst/file1 
src/file2 dst/file2 
src/file3 dst/file3 

Comment puis-je utiliser le contenu de chaque ligne dans le fichier arglist comme arguments à dire, une commande cp?

Répondre

7

l'option « -n » pour xargs spécifie le nombre d'arguments à utiliser par commande:

$ xargs -n2 < arglist echo cp 

cp src/file1 dst/file1 
cp src/file2 dst/file2 
cp src/file3 dst/file3 
+0

comment fonctionne <<'? – Michelle

1

Vous pouvez utiliser un tuyau (|):

cat file | echo 

ou redirection d'entrée (<)

cat < file 

ou xargs

xargs sh -c 'emacs "[email protected]" < /dev/tty' emacs 

Ensuite, vous pouvez utiliser awk pour obtenir des arguments:

cat file | awk '{ print $1; }' 

Hope this helps ..

+0

pas besoin chat pour la pièce d'awk – ghostdog74

+0

Tout cela fait _something_ mais tous d'entre eux sont hors cible. – Jamie

+0

'echo' ne lit pas' stdin'. De plus 'cat' n'a pas besoin de' echo'. De plus, vous n'avez pas besoin de rediriger vers 'cat' - cela fonctionne:' cat file'. –

3

L'utilisation read (cela ne suppose que les espaces dans les noms de fichiers dans arglist sont échappés):

while read src dst; do cp "$src" "$dst"; done < argslist 

Si les arguments du fichier sont dans l'ordre et les noms de fichiers avec des espaces sont cités, cela travaillera également:

while read args; do cp $args; done < argslist 
+0

+1 Beaucoup mieux que ma solution: -D – NawaMan

+0

une boucle de lecture va "manquer" la lecture de la dernière ligne s'il n'y a pas de dernière ligne. – ghostdog74

0

si votre but est juste cp ces fichiers dans theList

$ awk '{cmd="cp "$0;system(cmd)}' file 
+0

Marteaux? Ongles? –

+0

pas différent quand vous le faites avec shell. shell appelle la commande système aussi. – ghostdog74

0

utilisation de la boucle for avec IFS (séparateur de champ interne) mis à new line

OldIFS=$IFS # Save IFS 
$IFS=$'\n' # Set IFS to new line 
for EachLine in `cat arglist"`; do 
Command="cp $Each" 
`$Command`; 
done 
IFS=$OldIFS 
+0

Il n'est pas nécessaire de placer la commande et ses arguments dans une variable. De toute façon, vous devrez faire '$ Command' ou' \ '$ Command \' 'pour le faire fonctionner. –

+0

Merci, ça me manque: D – NawaMan

Questions connexes