我正在尝试创建一个脚本,该脚本将根据它们的名称和时间戳在服务器上搜索文件,并将这些文件的数量计入一个变量。当文件可用时,它工作正常,但在文件不可用时,抛出stderr。
为了抑制stderr,我试图将其重定向到/ dev / null,但这仍然无济于事,并且该错误仍然在屏幕上显示。我知道我可以先使用'if'语句检查文件是否可用,然后进行计数,但这会不必要地延长脚本的时间。
那么,有没有一种方法可以让我计算文件计数并抑制stderr(如果有),以及仅在一行代码中将输出分配给变量?
当服务器上存在名称为“ example”的文件时,此命令将成功运行:
file_name=example
file_date=20190901
file_count=`ls -lrt "$PWD"/"$file_name"*"$file_date"* | wc -l`
Run Code Online (Sandbox Code Playgroud)
但是,当文件不存在时,它将在屏幕上抛出stderr,如下所示:
ls: cannot access /home/saurap01/example*20190901*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
为了抑制此错误,我尝试将其重定向到/ dev / null,如下所示:
file_count=`ls -lrt "$PWD"/"$file_name"*"$file_date"* | wc -l` > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
但这甚至无助于抑制错误。
我可以使用以下方法隐藏stderr吗:
file_count=`ls -lrt "$PWD"/"$file_name"*"$file_date"* | wc -l` 2>&-
Run Code Online (Sandbox Code Playgroud)
您没有正确重定向stderr,2>/dev/null
应该紧接您要禁止stderr 的命令之后,例如:
file_count=`ls -lrt "$PWD"/"$file_name"*"$file_date"* 2>/dev/null | wc -l`
Run Code Online (Sandbox Code Playgroud)
但是, 解析输出ls
根本不是一个好主意,您应该使用find
此类任务。例如,使用GNU查找:
find -maxdepth 1 \
-type f \
-name "$file_name*$file_date*" \
-printf '.' | wc -c
Run Code Online (Sandbox Code Playgroud)
或使用任何符合POSIX的查找:
find . \
! \( -type d -path '*/*' -prune \) \
-type f \
-name "$file_name*$file_date*" \
-exec printf '.%.s' {} + | wc -c
Run Code Online (Sandbox Code Playgroud)