说我有一个文件/templates/apple
并且我想要
- 放在两个不同的地方,然后
- 删除原件。
因此, /templates/apple
将被复制到/templates/used
和/templates/inuse
,然后在此之后,我想删除原始文件。
cp
是执行此操作的最佳方法,其次是rm
吗? 或者,还有更好的方法?
我想一行完成所有操作,所以我认为它看起来像:
cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple
这是正确的语法吗?
#1楼
另一个选项是在每个命令的末尾键入Ctrl + V Ctrl + J。
示例(用Ctrl + V Ctrl + J替换#
):
$ echo 1#
echo 2#
echo 3
输出:
1
2
3
无论先前的命令是否失败,这将执行命令。
与: echo 1; echo 2; echo 3
echo 1; echo 2; echo 3
如果要停止执行失败的命令,请在每行的末尾添加&&
,最后一行除外。
示例(用Ctrl + V Ctrl + J替换#
):
$ echo 1 &&#
failed-command &&#
echo 2
输出:
1
failed-command: command not found
在zsh
您也可以使用Alt + Enter或Esc + Enter代替Ctrl + V Ctrl + J
#2楼
为什么不先将cp
移至位置1,然后将mv
移至位置2。这需要“删除”原始文件。
不,这不是正确的语法。 |
用于“管道”一个程序的输出,并将其转换为下一个程序的输入。 你想要的是;
,它分隔多个命令。
cp file1 file2 ; cp file1 file3 ; rm file1
如果您要求单个命令必须在下一个命令启动之前成功,那么您可以使用&&
代替:
cp file1 file2 && cp file1 file3 && rm file1
这样,如果任何一个cp
命令失败,则rm
将不会运行。
#3楼
尝试这个..
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
#4楼
您正在使用|
(管道)将命令的输出定向到另一个命令。 您正在寻找的是&&
运算符,只有前一个命令成功执行才能执行下一个命令:
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
要么
cp /templates/apple /templates/used && mv /templates/apple /templates/inuse
总结一下(非详尽地)bash的命令运算符/分隔符:
-
|
将一个命令的标准输出(stdout
)用管道stdout
到另一个命令的标准输入中。 请注意,无论发生什么情况,stderr
仍会进入其默认目的地。 -
|&
将一个命令的stdout
和stderr
都stderr
到另一命令的标准输入中。 非常有用,在bash版本4及更高版本中可用。 -
&&
执行的右手命令&&
仅在上一个成功。 -
||
执行||
的右手命令 只有前一个失败。 -
;
执行的右手命令;
始终不管上一个命令是成功还是失败。 除非先前曾调用set -e
,否则这将导致bash
因错误而失败。
#5楼
使用管道对我来说很奇怪。 无论如何,您应该使用逻辑and
Bash运算符:
$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples
如果cp
命令失败,则不会执行rm
。
或者,您可以使用for
循环和cmp
制作更详细的命令行。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3179476