我已经写了一个命令,只有mv如果文件存在,但其失败:
[ ! -f src/java/world.java ] || mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java
是否有任何选项可以检查路径src、src/java和文件是否存在?或者失败并一直返回零
src
src/java
k10s72fa1#
文件检查后对命令进行分组:
[ ! -f src/java/world.java ] || (mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java)
括号内的所有内容只有在src/java/ www.example.com存在时才会执行world.java。这方面的实际示例(注意mv的SOURCE参数中的srcX:
$ [ ! -f src/java/world.java ] || mkdir -p src/examples/ ; mv srcX/java/world.java src/examples/world.java mv: cannot stat 'srcX/java/world.java': No such file or directory $ [ ! -f src/java/world.java ] || (mkdir -p src/examples/ ; mv srcX/java/world.java src/examples/world.java)
由于您已经检查了完整的文件路径,因此src或src/java是否存在并不重要,因为world.java在这两种情况下都不存在--除非您想生成更合适的错误。
3vpjnl9f2#
虽然AND和OR列表(list1 && list2和list1 || list2)对于短代码很有吸引力,但是它们应该只用于基于单个命令的简单任务。其他任何东西都会影响代码的可读性和可维护性。对于OP,我建议使用sime if-语句,并将所有内容编写为
list1 && list2
list1 || list2
if
if [ -f /path/to/file ]; then mkdir -p -- /path/to/dir mv -- /path/to/file /path/to/dir fi
这段代码现在可读性很强,并声明,* 如果文件存在,那么做一些事情 *。AND和OR列表的复杂组合主要导致意外行为,因为实现做出了假设。一个简单的例子是cmd1 && cmd2 || cmd3。这里cmd3在cmd1 OR cmd2返回非零返回状态时执行,而不仅仅是在cmd1返回false时执行。
cmd1 && cmd2 || cmd3
cmd3
cmd1
cmd2
2条答案
按热度按时间k10s72fa1#
文件检查后对命令进行分组:
括号内的所有内容只有在src/java/ www.example.com存在时才会执行world.java。
这方面的实际示例(注意mv的SOURCE参数中的srcX:
由于您已经检查了完整的文件路径,因此src或src/java是否存在并不重要,因为world.java在这两种情况下都不存在--除非您想生成更合适的错误。
3vpjnl9f2#
虽然AND和OR列表(
list1 && list2
和list1 || list2
)对于短代码很有吸引力,但是它们应该只用于基于单个命令的简单任务。其他任何东西都会影响代码的可读性和可维护性。对于OP,我建议使用simeif
-语句,并将所有内容编写为这段代码现在可读性很强,并声明,* 如果文件存在,那么做一些事情 *。
AND和OR列表的复杂组合主要导致意外行为,因为实现做出了假设。一个简单的例子是
cmd1 && cmd2 || cmd3
。这里cmd3
在cmd1
ORcmd2
返回非零返回状态时执行,而不仅仅是在cmd1
返回false时执行。