2016-07-25 9 views
0

私はcatのファイルのリストを実行していますが、forループを使用してすべての出力を1つのファイルにリダイレクトしています。私のループは動作しますが、各ファイルの内容がダンプされる前にディスクリプタ行を追加し、各新しいファイルエントリの前にスペースを追加する方法を探しています。ここに私のスクリプトです。それはこのように見えるようにするためにfor loop output formatting:説明と空白を含む改行を追加します。

spawn ssh [email protected] 
run $command 
quit 
spawn ssh [email protected] 
run $command 
quit 

私が希望:

#!/bin/bash 

files=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}') 

for i in $files; do /bin/cat "$i" >> "/home/user/catfiles.txt" 
done 

私の出力は次のようになります

"Description for first file here" 
spawn ssh [email protected] 
run $command 
quit 
<space> 
"Description for second file here" 
spawn ssh [email protected] 
run $command 
quit 
<space> 

UPDATE:ファイル記述名は使用してファイルによって異なりますする必要があります実際のファイル名

"This is $file1" 
"This is $file2" 
etc,etc.. 

答えて

1

あなたがそれを必要とする。これは、それらをマージします:

for f in /home/user/*.txt;do 
    echo "This is ${f##*/}" >> /home/user/catfiles.txt 
    /bin/cat "${f}" >> /home/user/catfiles.txt 
    echo >> /home/user/catfiles.txt 
done 

ファイル名はそのパスなしでを印刷しています。パスを印刷する場合は、${f##*/}${f}に置き換えます。

更新

${variable##pattern}はパラメータ置換と呼ばれています。 Bashはpatternvariableで検索し、最長一致を削除します。この場合、変数はfで、patternは*/で、スラッシュで終わる文字列に一致します。 ##のダブルハッシュは、*/と一致させることができる最も長いStringをfから削除することを示します。 fはパスであるため、最後のファイルは/までのすべてのファイルと一致して削除されるため、ファイル名のみが残っています。 Bash documentationには、この件に関するさらに詳しい情報があります。または、のman bashを検索することもできます。

+0

"## * /"がファイルパスを削除する方法を説明できますか? – user53029

+0

@ user53029更新を参照してください – nautical

1

ですから、これをしたい、とところで、あなたのfiles=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}')が間違っている、don't parse ls出力、ジュース用シェル:

for i in /home/user/*.txt; do 
    echo "Description for first file here $i" >> /home/user/catfiles.txt 
    /bin/cat "$i" >> "/home/user/catfiles.txt" 
    echo >> /home/user/catfiles.txt 
done 
+0

いいえ、近いかもしれませんが、多分私は十分に明確ではありませんでした。説明は変更する必要があり、「ファイル1」、「ファイル2」などのいくつかの定義的特性を取る必要があります。実際のファイル名などです。例えば、 "This is $ file1"、これは$ file2などです。 – user53029

+0

@ user53029上記のように説明部分に$ iを使用してください。 –

0

これは、問題を解決します:

for i in /home/user/*; do 
echo "This is from $i" >> "/home/user/catfiles.txt" 
/bin/cat "$i" >> "/home/user/catfiles.txt" 
    echo >> "/home/user/catfiles.txt" 
done 

"I" 以来この場合の各ファイルを表し、echoで始まる2行目の$ iは異なるファイル名を与えます。

ファイルパスを除外して、単に/ home/userのないファイル名にする場合は、3行目以降にsedステートメントを挿入できます。

for i in /home/user/*; do 
echo "This is from $i" >> "/home/user/catfiles.txt" 
/bin/cat "$i" >> "/home/user/catfiles.txt" 
/bin/sed -i -e 's/\/home\/user\///g' /home/user/catfiles.txt 
    echo >> "/home/user/catfiles.txt" 
done 
+1

'sed'を実行する必要はありません。パスを除外したい。 Bashはこれをパラメータ置換によって行うことができます。 – nautical

+0

チップをありがとう。 – user53029

関連する問題