2017-07-21 8 views
1

ディレクトリ内の特定のファイルタイプのすべてのファイルを再帰的にループする必要があります。ファイルタイプは、処理のために通過する必要があるファイルタイプのリストを含む配列変数です。配列の値は実際には動的に取り込まれます。わかりやすくするために、私は静的配列を宣言しています。シェルスクリプトを使用して特定のファイルタイプのファイルを見つける

declare -a arr=("pdf" "doc" "txt") 

私は再帰的にディレクトリ内のすべてのファイルを一覧表示するために、次のコードを持っているが、私は、配列に含まれているこれらのファイルタイプを取り戻すだけに、アレイ「ARR」が含まれる方法を把握することはできませんよ。

find $i -type f -print0 | while read -d $'\0' file; do 
    echo $file; 
    #Process file 
done 

コードを修正して、指定したファイルタイプのみを取得できるようにしてください。すべてのファイルではありません。あなたが行う必要がありますどのような

+0

は、[この質問](https://superuser.com/questions/126290/find-files-filtered-by-multiple-拡張機能)は、スーパーユーザーのSEサイトに役立つかもしれません。 –

答えて

2

ファイルタイプが "pdf"、 "doc"、 "txt"、 の場合は、それらの拡張子を持つファイル名を意味します。

ファイルの種類の数は(数十未満)合理的に小さい場合、 あなたはフォーマットでfindに渡す引数の配列を構築することができます:

の配列を想定し
... -name '*.pdf' -o -name '*.doc' -o -name '*.txt' ... 

ファイルタイプ空ではない、ここでそれを行うための一つの方法(感謝@mike-holt)です:

arr=(pdf doc txt) 

findargs=() 

for t in "${arr[@]}"; do 
    findargs+=(-name "*.$t" -o) 
done 

find . -type f \("${findargs[@]}" -false \) 
+0

私はあまりにも好きです。 –

3

-regexオプションでfindに渡す(拡張を想定)タイプのあなたの配列から正規表現を構築し、動的です。 findは、regexを使用して、一致するファイル名を検索できます。あなたの例を考えると、あなたはに似正規表現構築するために欠けている:配列の内容から動的にその正規表現を構築するために

"^.*[.]\(pdf\|doc\|txt\)$" 

を、次の

#!/bin/bash 

arr=(pdf doc txt) ## dynamically built array of extensions 
n=${#arr[@]}  ## number of elements in array 
regex='^.*[.]\(' ## beginning of regex 
srch="${1:-.}"  ## path to search (default '.') 

for ((i = 0; i < $n; i++)); do ## loop over each element 
    ## if not last, add "${arr[i]}\|" otherwise add "${arr[i]}\)" 
    ((i < n - 1)) && regex="$regex${arr[i]}\|" || regex="$regex${arr[i]}\)" 
done 

regex="$regex\$" ## add the final '$' 

find "$srch" -type f -regex "$regex" ## execute the find 

に似た何かを行うことができます(これはPOSIXシェルポータブルないよう音符これはループアレイのbashの特定Cスタイルを使用する - あなたは配列を使用しているので、問題にはならない)

それを試してみて、それがあなたの必要を満たすかどうかを教えてください。

+0

または単に 'find \($(printf - " -name *。%s -o "" $ {arr [@]} ")-false \)' –

+1

これは簡単なアプローチのようです@janosが答えた通りに '-name'と' -o'を返します。私はRube Goldberg * regex *のアプローチをとった:) ' –

+1

@MikeHolt' * 'はシェルによって拡張されるかもしれない。それはあまり安全ではありません。しかし、私は '-false'であなたからのヒントを得て、それで私の答えを大幅に改善しました、ありがとう! – janos

関連する問題