Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中检查文件是否存在的替代方法_Bash - Fatal编程技术网

Bash中检查文件是否存在的替代方法

Bash中检查文件是否存在的替代方法,bash,Bash,我目前正在运行一个脚本(check_files.sh),该脚本可能会生成也可能不会生成match*文件(例如match1.txt、match2.txt等)。然后我想在生成的match*文件上运行一个R脚本 但是,在运行R脚本之前,我在脚本中尝试了一行代码,检查文件是否存在 if [ -s match* ] then for f in match* do Rscript --vanilla fo

我目前正在运行一个脚本(check_files.sh),该脚本可能会生成也可能不会生成match*文件(例如match1.txt、match2.txt等)。然后我想在生成的match*文件上运行一个R脚本

但是,在运行R脚本之前,我在脚本中尝试了一行代码,检查文件是否存在

if [ -s match* ]
            then
            for f in match*
            do
                Rscript --vanilla format_matches.R ${f}
                rm match*
            done
else
            echo "No matches present"
fi
但是,我不断收到一条错误消息(因为通常会生成很多匹配文件):


是否有[-s match*]的替代方案不会抛出错误消息?我认为错误消息会出现,因为生成了多个match*文件。

您可以将逻辑更改为以下内容:

found=0
for f in match*; do
    [ -e "$f" ] || continue
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi

您可以将逻辑更改为以下内容:

found=0
for f in match*; do
    [ -e "$f" ] || continue
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi

如果您希望文件名带有空格,这有点难看,但很健壮:

found=0
find -maxdepth 1 -type f -name 'match*' -print0 | while IFS= read -rd $'\0' f
do 
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi

如果您希望文件名带有空格,这有点难看,但很健壮:

found=0
find -maxdepth 1 -type f -name 'match*' -print0 | while IFS= read -rd $'\0' f
do 
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi
是否有[-s match*]的替代方案不会抛出错误消息

以下内容适用于我的示例文件match1.txt

if [ -f ~/match* ]; then
  echo "yeha"
fi
是否有[-s match*]的替代方案不会抛出错误消息

以下内容适用于我的示例文件match1.txt

if [ -f ~/match* ]; then
  echo "yeha"
fi


只要文件名上没有空格,这种方法就可以使用。我尝试过这种方法,但在没有生成匹配*文件的情况下,我会遇到以下错误:
无法打开文件“matches*”:没有这样的文件或目录
这是不正确的,因为
match*
扩展为
match*
(标识)当没有匹配的文件时。因此,无论如何都会执行循环。
nullglob
bash扩展将是实现这一点的一种方法。或者,只需测试循环中是否存在匹配的文件也会起作用。True@kojiro,修复了上面提到的对我的错误消息的approach响应-你是正确的kojiro,这实际上是指R脚本。如果不存在任何文件,则会将文本参数
match*
调用到R中。为了解决此问题,我在R脚本的开头添加了:
If(nchar(args)7){scriptcontent}
只要文件名上没有空格,这种方法就行。我尝试过这种方法,但在没有生成匹配*文件的情况下,我会遇到这样的错误:
无法打开文件“matches*”:没有这样的文件或目录
这是不正确的,因为
match*
扩展为
match*
(身份)当没有匹配的文件时。因此,无论如何都会执行循环。
nullglob
bash扩展将是实现这一点的一种方法。或者,只需测试循环中是否存在匹配的文件也会起作用。True@kojiro,修复了上面提到的对我的错误消息的approach响应-你是正确的kojiro,这实际上是指R脚本。如果不存在任何文件,则会将文本参数
match*
调用到R中。为了解决此问题,我在R脚本的开头添加了:
If(nchar(args)7){scriptcontent}如果文件名包含换行符或反斜杠,这将不起作用。请考虑使用<代码>查找…-ExcBASH-C“脚本”。
表单,而不是管道输出
find
。文件名上的反斜杠和换行符?这是一个严肃的问题,发生过吗?是的。文件名是此程序的用户输入。不要相信用户输入。我修复了原始循环,以便它可以正确处理换行符和反斜杠。
-print0
-d$'\0'
接受caRealEngRead,<代码> Read -r>代码>负责反斜杠,<代码> IFS= 确保引导空白。如果文件名包含换行符或反斜杠,这将不起作用。请考虑使用<代码>查找…-ExcBASH-C“脚本”。表单,而不是管道输出
find
。文件名上的反斜杠和换行符?这是一个严肃的问题,发生过吗?是的。文件名是此程序的用户输入。不要相信用户输入。我修复了原始循环,以便它可以正确处理换行符和反斜杠。
-print0
-d$'\0'
接受ca对于换行符,
read-r
处理反斜杠,
IFS=
确保保留前导空格。