同じプレフィックスを持つ複数のファイルがディレクトリにあることを確認したいと思います。
このディレクトリ - >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"
find
find
名前を一致させるためにシェルglobを使用することと、ファイルタイプの一致にもっと厳しいinを使用することには、微妙な違いがあります。ユーティリティfind
は、ファイルまたはディレクトリへのシンボリックリンクをファイルまたはディレクトリとして検出せずにシンボリックリンクとして検出し、シェルはシンボリックリンクを逆参照してリンクターゲットをテストします。
答え2
"files"の複数形と接頭辞について話すとき、ファイル名$SRC_FILE_EXT
の後に何かがあるようです$SRC_FILE_EXT*
。
ただし、これは1つの引数だけを要求しながら複数の一致を提供できますtest -s
。
したがって、テストを修正することをお勧めします。
if [ "$(find . -name \"${WORK_DIR}/${SRC_FILE_EXT}*\" )" != "" ]; then