静默统计检查文件是否存在

静默统计检查文件是否存在

如果 bash 的一行中存在文件,我将运行命令。

这是我现在正在做的事情:

$ stat /last_dump.sql && mysql -D my_database < last_dump.sql

这是正确的做法吗?

工作正常,但是输出了统计报告

  File: '/last_db.sql'
  Size: 42161       Blocks: 88         IO Block: 4096   regular file
Device: 26h/38d Inode: 108         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    me)   Gid: (    0/    me)
Access: 2016-06-08 08:07:15.886741191 +0000
Modify: 2016-06-08 08:07:06.218593606 +0000
Change: 2016-06-08 08:07:06.218593606 +0000
 Birth: -

我怎么能够不是显示此统计报告?

答案1

您还可以使用文件测试运算符:

[[ -e ./last_dump.sql ]] && mysql -D my_database < ./last_dump.sql

有关这些运算符的更多信息,请参见此处:文件测试操作员

但如果您喜欢使用,stat可以将其输出转移到/dev/null

stat ./last_dump.sql >/dev/null && mysql -D my_database < ./last_dump.sql

请注意./上面的命令中的意思是当前目录。另外我应该注意,如果您想让 stat 完全静默(即使出现错误),/dev/null也可以使用&>/dev/nullor >/dev/null 2>&1(具有相同的结果)将错误转移到。

答案2

调用stat仅在获取无法从基本 shell 命令获取的信息时有用,例如文件的修改时间或权限。要测试文件是否存在,请使用该test命令,也拼写为[.该命令内置于大多数 shell 中。

if [ -e last_dump.sql ]; then mysql -D my_database < last_dump.sql; fi

test 测试-e指定文件是否存在;该文件可以是任何类型,包括损坏的符号链接。如果您只需要常规文件(包括常规文件的符号链接),请改用-f

出于多种原因,使用[ … ]优于:stat

  • 调用stat只是丢弃其输出是测试文件是否存在的一种混淆方式。想想将要阅读代码的人(例如六个月后的您):[ -e file ]简单地说“file存在吗?”,而调用则stat说“给我文件的元数据”,而测试是否存在只是一个副作用。
  • [ … ]是一个标准命令,但stat并非在所有 Unix 变体上都存在,并且存在不兼容的命令行选项。在这种特定情况下,情况并没有那么糟糕,因为您没有使用任何命令行选项。
  • stat由于它是外部命令,因此速度较慢。

&&当你的意思是“如果”时,你也应该避免使用。这也明显可读性较差。它也不太健壮,因为在set -e(如果任何程序中断则告诉 shell 退出),如果不存在则[ -e last_dump.sql ] && mysql …中止脚本,而继续运行。last_dump.sqlif [ -e last_dump.sql ]; then …; fi

相关内容