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*"

也就是说,展开与您感兴趣的名称匹配的模式,设置位置参数。特殊变量$#将包含匹配名称的数量。设置nullglobshell 选项,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使用 shell glob 来匹配名称和使用in之间有一个微妙的区别,find后者对文件类型匹配更严格。该find实用程序不会将文件或目录的符号链接检测为文件或目录,而是将其检测为符号链接,而 shell 将取消引用符号链接并测试它链接到的内容。

答案2

当您谈论复数形式的“文件”和前缀时,我认为文件名$SRC_FILE_EXT后面包含一些内容,因此您需要一个像$SRC_FILE_EXT*.

但这可能会给你多个匹配项,而test -s只需要一个参数。

所以我建议修改你的测试

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

相关内容