2009-11-04 7 views
5

ファイルの内容をコマンドライン引数として使用する方法を知りたいが、構文に苦しんでいる。ファイル内容をBASHのコマンドライン引数として使用する

は、私は次のことを持って言う:

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

は、どのように私は言うの引数、cpコマンドとしてarglistファイル内の各行の内容を使用できますか?

答えて

7

xargsの-nオプションは、コマンドごとに使用:あなたの目的はthelistにそれらのファイルをCPにちょうどある

$ xargs -n2 < arglist echo cp 

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

'<'はどのように動作しますか? – Michelle

1

あなたがパイプを使用することができます(|):次に、あなたが引数を取得するためにはawkを使用することができ

cat file | echo 

または入力リダイレクション(<)

cat < file 

またはxargs

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

を:

(これは arglist内のファイル名にスペースがエスケープされていることを前提としていない) readを使用して、このことができます
cat file | awk '{ print $1; }' 

・ホープ..

+0

不要に設定IFS(内部フィールドセパレータ)とforループawkの作品のための猫 – ghostdog74

+0

これらのすべては_何かをするが、それらはすべて目標外である。 – Jamie

+0

'echo'は' stdin'から読み込みません。 「cat」には 'echo'は必要ありません。また、 'cat'にリダイレクトする必要はありません。これは' cat file'です。 –

3

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

ファイル内の引数が正しい順序である場合ファイル名にスペースがある場合は、次のようにもなります。

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

+1私の解決策よりもはるかに優れています.-D – NawaMan

+0

最後の改行がない場合、読み込みループが最後の行を読み逃してしまいます。 – ghostdog74

0

場合

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

ハンマー?釘? –

+0

シェルで行うときに違いはありません。シェルもシステムコマンドを呼び出しています。 – ghostdog74

0

使用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

コマンドとその引数を変数に入れる必要はありません。とにかく、それを動作させるには、 '$ Command'や' \ '$ Command \' 'を実行しなければなりません。 –

+0

ありがとう、私はそれを逃す:D – NawaMan

関連する問題