2016-06-14 8 views
0

私はコードを引数としてCSVファイルを取るBASHコード、すなわちを持っています。ディレクトリには多くのCSVファイルがあり、そのすべてを個別に処理する必要があります。コードを各CSVファイルに適用するにはどうすればよいですか?

+2

から先頭文字./を取り除くために、bashパラメータ拡張を使用しました。 –

答えて

5

for.csvファイルをループに構築し、スクリプトに一度に1を渡す使用します

for file in *.csv; do ./mycode.sh "$file"; done 
1

ます。また、このためにfindコマンドを使用することができます -

find . -name "*.csv" -type f -printf '%f\n' -exec ./mycode.sh {} \; 
  • 拡張子が.csv、先行なしのファイルを見つける./
  • R改行や空白または他の特殊文字の他のタイプを含むファイル名を処理するには

    -print0を採用しています - :すべてのファイルのアンスクリプトmycode.shは、現在のフォルダから

アップデートを返さfindからデリミタ''で読み取ってください。また、複数の入力ファイルを処理するためにスクリプトを改善findコマンド

#!/bin/bash 

find . -name "*.csv" -type f -print0 | 
    while IFS= read -r -d '' x; do 
     ./mycode.sh "${x:2}" 
    done 
+1

'-printf'は標準ではありません。ファイル名だけを印刷したいので、代わりに '-print'を使用してください(ただし、先頭のディレクトリも印刷されますが、少なくとも移植可能です)。 –

+0

@gniourf_gniourf:提案していただきありがとうございます、私の更新された答えをチェックしてください! – Inian

+2

まあ、 '-print0'も非標準です。オリジナルの答えは、 'while'ループ(および非標準の' -print0')を必要とせずに、ファイル名のすべてのタイプの面白いシンボル(スペース、改行、グロブなど)を適切に処理することに注意してください。同じ移植性を実現するには: 'find。 -name '* .csv' -type f -exec sh -c 'printf%s \\ n "$ 0"; ./mycode.sh "$ {0#。/}" '{} \; '、またはテーマのバリエーション。 –

関連する問題