ディレクトリが配列変数と一致するかどうか

ディレクトリが配列変数と一致するかどうか

ディレクトリにファイル拡張子の配列が含まれていることを確認したいと思います。 UbuntuでBashを使用しています。

それは次のとおりです。

files=$(ls $1/*)

extensions=$( txt pdf doc docx)

if [[ -e $files[@] contains $extenstions[@] ]] && echo "document exists" || 

echo "nothing found"

答え1

この試み:

shopt -s nullglob
files=(*.txt *.pdf *.doc *.docx)
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

または

shopt -s nullglob extglob
files=(*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

すべてのサブディレクトリにもファイルが必要な場合:

shopt -s nullglob extglob globstar
files=(**/*.+(txt|pdf|doc|docx))
if [[ ${#files} -eq 0 ]]; then echo "nothing found"; fi

からman bash

nullglob: 設定されている場合、bash はファイルと一致しないパターンを自分ではなく空の文字列に拡張することを許可します。

extglob:設定すると、拡張パターンマッチング機能が有効になります。下記をご覧ください。

globstar:設定されている場合、パス名拡張コンテキストで使用されるパターン**は、すべてのファイルとゼロ以上のディレクトリとサブディレクトリと一致します。

拡張ワイルドカード:

?(pattern-list):与えられたパターンが0個または1個発生するのと一致します。

*(pattern-list):与えられたパターンのゼロ以上の発生と一致します。

+(pattern-list): 指定されたパターンと 1 つ以上一致します。

@(pattern-list):与えられたパターンの1つと一致します。

!(pattern-list):与えられたパターンの1つを除くすべてと一致します。

答え2

ディレクトリ内のすべてのファイルを見つけます。

 #find all types of files
 PDFS=`find . -type f | grep pdf |wc -l`
 TXTS=`find . -type f | grep txt |wc -l`
 DOCS=`find . -type f | grep doc |wc -l`
 DOCXS=`find . -type f | grep docx |wc -l`
 SUM=$(( PDFS + TXTS + DOCS + DOCXS ))
 if [[ $SUM=0 ]] ; then 
    echo "not found"
 else
    echo "Some document found"

PDFタイプの文書数の検索など、他の同様の操作を実行できます。

grep -EOR(|)条件を使用して1つの式のみを作成して、任意の種類のファイルを計算できます。これにより、1つのコマンドに減らされます。

別の簡単な計算オプション:

   numberoffiles=`find -name "*.pdf" -o -name "*.doc" -o name "*.txt"`

答え3

set   --                             ### init arg array
for e in txt pdf doc docx            ### outer loop for convenience
do    for  f in ./*."$e"             ### inner loop for files
      do   case  $f in (./\*"$e")    ### verify at least one match
           [ -e "$f" ];; esac &&     ### double-verify
           set  "$f" "$@"            ### prepend file to array
done; done                           ### double-done

$1完了すると、すべてのファイルがおよび$2などに配置されます。グループ全体を単一の文字列(例:)として参照することも、別々の"$*"文字列リスト"$@"(例:)として参照することもできます。からカウントを取得できます"$#"。以下を使用してarg配列メンバーを操作できます。set (上記のように)それ以外の場合shift

答え4

拡張リストを次に切り替えます。@(…|…) ワイルドカードパターン

shopt -s extglob nullglob
pattern='@('
for x in "${extensions[@]}"; do
  x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
  pattern="$pattern$x|"
done
pattern="${pattern%\|})"
matches=(*.$pattern)
if ((${#matches[$@]})); then
  echo "There are matches"
fi

または(特にサブディレクトリでファイルを繰り返し検索する場合)find

name_patterns=("(")
for x in "${extensions[@]}"; do
  x=${x//"\\"//"\\\\"}; x=${x//"?"//"\\?"}; x=${x//"*"//"\\*"}; x=${x//"["//"\\["}
  name_patterns+=(-name "*.$x" -o)
done
name_patterns[${#name_patterns[@]}]=")"
if [ -n "$(find dir "${name_patterns[@]}" | head -n 1)" ]; then
  echo "There are matches"
fi

またはzshを使用してください。

matches=(*.$^extensions(NY1))
if ((#matches)); then
  echo "There are matches"
fi

関連情報