リスト内のすべてのファイルの内容を別のファイルにコピーするにはどうすればよいですか?


15

というファイル内にファイル名のリストがありますlist_of_files.txt

そのリストの各ファイルの内容を、という別のファイルにコピーしますall_compounds.sdf

コマンドラインからこれを行うにはどうすればよいですか?

回答:


20

ファイル名を取得するために単純なコマンド置換を使用しないでください(スペースやその他の特殊文字で簡単に壊れる可能性があります)。次のようなものを使用しますxargs

xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf

またはwhile readループ:

while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf

コマンド置換を安全に使用するには、少なくともIFS改行のみに設定し、グロビング(ワイルドカード拡張)を無効にします。

(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)

()現在のシェルがこれらの変更の影響を受けないように、周囲の括弧はこれをサブシェルで実行します。


14

早くて汚い方法...

cat $(cat list_of_files.txt) >> all_compounds.sdf

注:これは、リスト内のファイル名が非常に適切に動作している場合にのみ機能します-スペース、改行、またはシェルにとって特別な意味を持つ文字がある場合、問題が発生します- 信頼できる結果を得るために代わりこの回答を使用してください

ノート

  • catcon catはファイルを生成します。また、コンテンツも印刷します。
  • コマンド置換command2 $(command1)を使用すると、ファイルを連結する()の出力をcommand1cat list...)に渡すことができます。command2cat
  • 次に>>、stdoutに出力する代わりに、リダイレクトを使用して出力をファイルに送信します。出力を表示する場合は、tee代わりに次を使用します。

    cat $(cat list_of_files.txt) | tee -a all_compounds.sdf

(私が使用している>>代わりに>teeして-a-これはあなたのファイルが既に存在する場合にはスイッチアペンドが既に存在する場合、代わりにそれを上書きするファイルへ)


1
同様に、単語の分割を避けるために、コマンド置換を引用@Zanna"$(cat list_of_files.txt)"
Sergiy Kolodyazhnyy

4
@Sergは、単語の分割が行われない場合cat、リスト全体を1つの引数として取得します。
ムル

@muru OK、スペースを含むファイル名をどのように処理しますか?
セルギーKolodyazhnyy

1
@Sergはそれに応じてIFSを設定しました-私の答えの最後の段落を参照してください
-muru

4

GNU awkはテキスト処理ユーティリティですが、system()呼び出しによって外部シェルコマンドを実行できます。それを次のように有利に活用できます。

$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt                                                        

ここでの考え方は簡単です。ファイルを1行ずつ読み取り、各行から書式付き文字列を作成しcat "File name.txt"、それをに渡しsystem()ます。

そして、ここで動作しています:

$ ls
file1.txt  file2.txt  file3 with space.txt  file_list.txt


$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt                                                        
Hi, I'm file2
Hi, I'm file1
Hi, I'm file3

そのため、タスクの大部分は既に完了しています。リスト上のすべてのファイルを印刷しました。残りは簡単です。最終出力を>演算子付きのファイルにリダイレクトし、要約ファイルに入れます。

awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt > output.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.