BASH

2009-11-04 25 views
5

'da dosya içeriklerini komut satırı tartışmaları olarak kullanma Bir dosyanın içeriğini komut satırı argümanları olarak nasıl kullanacağımı bilmek istiyorum, ancak sözdizimi ile uğraşmak istiyorum.BASH

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

nasıl söyleyecek argümanlar olarak arglist dosyadaki her satırın içeriğini kullanabilirsiniz bir cp komut:

Aşağıdaki olduğunu farz edelim?

cevap

7

xargs için '-n' seçeneği kaç argüman belirtir komutu başına kullanın: amacınız thelist içinde bu dosyaları cp için adildir

$ xargs -n2 < arglist echo cp 

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

'<' çalışır? – Michelle

1

Sen boru kullanabilirsiniz (|):

cat file | echo 

veya giriş yönlendirme (<)

cat < file 

veya

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

xargs Sonra argümanları almak için awk kullanabilir:

(Bu arglist olarak dosya herhangi boşluklarda çıkış durumlar varsayılarak) read Kullanılması bu yardımcı olur
cat file | awk '{ print $1; }' 

Umut ..

+0

gerek ayarlı IFS (Dahili Saha Ayırıcı) ile for döngü awk parçası için kedi – ghostdog74

+0

Bunların hepsi _something_ ama hepsi hedef dışı. – Jamie

+0

'echo' stdin'den okumaz. Ayrıca kedi 'echo' gerekmiyor. Ayrıca, 'cat' içine yönlendirmek zorunda değilsiniz - bu çalışır:' cat file'. –

3

:

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

dosyasındaki argümanlar doğru sırayla iseniz ve boşluklarla dosya cinsindendir, o zaman bu da çalışır:

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

+1 Benim çözümümden çok daha iyi: -D – NawaMan

+0

bir süre okunan döngü, son yeni satır yoksa son satırı okuyacaktır. – ghostdog74

0

eğer

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

Çekiçler? Çiviler? –

+0

Kabuk ile yaptığınızda farklı değil. kabuk da sistem komutunu çağırıyor. – ghostdog74

0

Kullanım 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

Komut ve argümanlarını bir değişkene koymak gerekli değildir. Her neyse, çalışmasını sağlamak için '$ Command' veya' \ '$ Command \' 'yapmalısınız. –

+0

Teşekkürler, özlüyorum: D – NawaMan