ユーザー指定の拡張子を持つファイルの検索

ユーザー指定の拡張子を持つファイルの検索

複数のファイル拡張子をカンマ区切り文字列として使用し、それを使用して特定のディレクトリ構造のファイルを一覧表示するスクリプトを作成していますが、提供される拡張子の数は異なる場合があります。

私が使用するfindコマンドは次のとおりです。

     find ./ -type f \( -iname \*.ksh -o -iname \*.cfg \)

ここでユーザーはkshファイルとcfgファイルを検索しています。ただし、ユーザーはksh、cfg、またはそれ以上の拡張のみを見つけることができます。複数の拡張機能に共通の検索パターンを作成する方法はありますか?

ベストアンサー1

ファイル名のサフィックスを別のコマンドライン引数として取得したとします(カンマ区切り文字列の処理方法については、回答の最後を参照してください)。

#!/bin/sh

for suffix do
    set -- "$@" -o -iname "*.$suffix"
    shift
done

shift

find . -type f \( "$@" \)

スクリプトが呼び出されます。

./script.sh ksh cfg

$suffix位置パラメータのすべてのサフィックスを-o -iname "*.$suffix"

shift通話前の唯一の文字は、削除済みfind-o最初の文字です"$@"

ksh93またはで配列を使用するbash

#!/bin/ksh

name_opts=()

for suffix do
    name_opts+=( -o -iname "*.$suffix" )
done

find . -type f \( "${name_opts[@]:1}" \)

inは配列の最初の(初期)要素を:1削除します。"${name_opts[@]:1}"name_opts-o


サフィックスをカンマで区切られた文字列としてインポートする場合(つまり、RCSまたはCVSリポジトリのファイルなど、ファイル名のサフィックスにカンマを含むファイルを見つけるためにスクリプトを使用できないことを意味します)、文字列を変換できます。$list、配列として、bashまたはksh93

set -f
suffixes=( ${list//,/ } )
set +f

shまたは

set -f
set -- $( printf '%s\n' "$list" | tr ',' ' ' )
set +f

または

set -f; ifs=$IFS; IFS=','
set -- $list
set +f; IFS=$ifs; unset ifs

(これらは位置パラメータをサフィックスリストに設定します。)

このset -fファイル名は、カンマを置き換えるスペースに文字列を分割するためにシェルに依存するために生成されます(ワイルドカード)。いいえワイルドカードには生成された単語を使用します。それ以外の場合、またはなどのサフィックスの要求をset -f正しく処理できません。[ch]*

bashループはまたは次kshから始まります。

for suffix do ...

到着

for suffix in "${suffixes[@]}"; do ...

そしてループはshそのまま残ります。

おすすめ記事