ディレクトリに複数のファイルがあることを確認する Bash コマンド

ディレクトリに複数のファイルがあることを確認する Bash コマンド

同じプレフィックスを持つ複数のファイルがディレクトリにあることを確認したいと思います。

このディレクトリ - >WORK_DIRとファイルプレフィックス - >SRC_FILE_EXT

現在、次のスクリプトがあります。

if [ -s ${WORK_DIR}${SRC_FILE_EXT} ] ;  then
   echo "+ File is present on the source directory" >> $LOG_FILE
else

   echo "No files to move" >> $LOG_FILE
   exit 4
fi

ただし、このスクリプトはNo files to moveを発生させます。

誰でも私を助けることができますか?

答え1

shopt -s nullglob

set -- "$WORK_DIR/$SRC_FILE_EXT"*

printf 'There are %d names that match "%s"\n' "$#" "$WORK_DIR/$SRC_FILE_EXT*"

つまり、興味のある名前に一致するパターンを展開し、位置パラメータを設定します。特殊変数には、$#一致する名前の数が含まれます。パターンがまったく一致しない場合は、パターンが何も拡張されないようにするnullglobシェルオプションを設定します。bash

ディレクトリが一致しないことを確認するには、単純なループを使用してディレクトリ以外の数を計算できます。

shopt -s nullglob

num=0
for name in "$WORK_DIR/$SRC_FILE_EXT"*; do
    [ ! -d "$name" ] && num=$(( num + 1 ))
done

printf 'There are %d non-directories with names that match "%s"\n' "$num" "$WORK_DIR/$SRC_FILE_EXT*"

使用find:

find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l

find非標準-maxdepth述語を理解すると仮定)。$WORK_DIR名前で始まるディレクトリ以外の数を返します$SRC_FILE_EXT

num=$( find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l )

printf 'There are %d non-directories with names that match "%s" in "%s"\n' \
    "$num" "$SRC_FILE_EXT*" "$WORK_DIR"

findfind名前を一致させるためにシェルglobを使用することと、ファイルタイプの一致にもっと厳しいinを使用することには、微妙な違いがあります。ユーティリティfindは、ファイルまたはディレクトリへのシンボリックリンクをファイルまたはディレクトリとして検出せずにシンボリックリンクとして検出し、シェルはシンボリックリンクを逆参照してリンクターゲットをテストします。

答え2

"files"の複数形と接頭辞について話すとき、ファイル名$SRC_FILE_EXTの後に何かがあるようです$SRC_FILE_EXT*

ただし、これは1つの引数だけを要求しながら複数の一致を提供できますtest -s

したがって、テストを修正することをお勧めします。

if [ "$(find . -name \"${WORK_DIR}/${SRC_FILE_EXT}*\" )" != "" ]; then

関連情報