shell 如何移动文件只有当文件和路径存在?

i7uaboj4  于 2022-12-19  发布在  Shell
关注(0)|答案(2)|浏览(132)

我已经写了一个命令,只有mv如果文件存在,但其失败:

[ ! -f src/java/world.java ] || mkdir -p src/examples/ && mv src/java/world.java src/examples/world.java

是否有任何选项可以检查路径srcsrc/java和文件是否存在?
或者失败并一直返回零

k10s72fa

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在这两种情况下都不存在--除非您想生成更合适的错误。

3vpjnl9f

3vpjnl9f2#

虽然AND和OR列表(list1 && list2list1 || list2)对于短代码很有吸引力,但是它们应该只用于基于单个命令的简单任务。其他任何东西都会影响代码的可读性和可维护性。对于OP,我建议使用sime 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。这里cmd3cmd1 OR cmd2返回非零返回状态时执行,而不仅仅是在cmd1返回false时执行。

相关问题