想要检查该目录中是否存在多个具有相同前缀的文件。
这里目录 -->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
shell 选项,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