web-dev-qa-db-ja.com

1つのコマンドライン操作でディレクトリ内のすべてのファイルを連結するにはどうすればよいですか?

ディレクトリに1000個のcsvファイルがあります。それらを順番にまとめたいと思います。それらはimg_size_1.csvからおよそimg_size_1000.csvに名前が付けられます この答え は近いですが、リストファイルを想定しています。これはワンライナーで行うことができますか?

21
codecowboy

はい、想像を絶する名前のcatコマンドで可能です。

$ cat *csv > all.csv

catはボトルで言うことを行い、入力を連結して標準出力に出力します。上記のコマンドは、all.csvというファイルがターゲットディレクトリにすでに存在する場合にエラーを発生させます。

$ cat *csv > all.csv
cat: all.csv: input file is output file

このエラーは無視してかまいません。all.csvの内容は上書きされます。 どうやら、一部のシステム(この回答の下のコメントによるとOSXなど)では、エラーを無視できず、これはループに入り、all.csvがディスク領域がなくなるまでそれ自体に戻ります。存在する場合は、コマンドを実行する前に、all.csvが存在する場合は削除してください。

28
terdon
ls -1 *.csv | while read fn ; do cat "$fn" >> output.csv.file; done

それらをアルファベット順に連結したい場合:

ls -1 *.csv | sort | while read fn ; do cat "$fn" >> output.csv.file; done

時間の作成順にそれらを連結したい場合:

ls -1t *.csv | while read fn ; do cat "$fn" >> output.csv.file; done
6
Slyx