使用命令扩展创建目录:引用问题

时间:2017-07-21 17:20:02

标签: shell zsh

我的工作流程存在以下典型问题:我想将一些文件复制到尚未创建的目录中。大多数情况下我是这样做的:

cp *.JPG /some/path/[oops, I recalled that the directory does not exist, ^C]
mkdir /some/path/newdir
cp *.JPG /some/path/newdir

为了避免这种情况,我创建了一个名为md的脚本,它创建了一个目录并返回其路径:

#!/bin/sh

mkdir -p "$*"
echo "$*"

然后我的工作流程如下:

cp *.JPG `md /some/path/newdir`<TAB><ENTER>

当我按<TAB>时,执行md,创建目录并使用其路径替换反引号,然后我可以按<ENTER>并执行cp。< / p>

除非我在新目录的路径中有空格,否则一切正常。在这种情况下,扩展后,我的命令行上没有未转义的空格。

我尝试通过将路径放在这样的引号(md)中来克服这个问题:

echo "'$*'"

但在扩展后的这种情况下,我有引用转义:

cp *.JPG \'/Users/user/temp/one two three\'

有什么办法可以避免在zsh中扩展命令扩展的引号?我尝试了$()和不同类型的引号("而不是'),但没有任何效果。

当然,我可以这样做:

cp *.JPG "`md /path/with spaces`"

但是如果可能的话,我想保存几次击键。

1 个答案:

答案 0 :(得分:1)

我认为解决这个问题最简单的方法是为整个事情创建一个脚本/函数(我更喜欢一个函数,因为你可能只会从交互式shell会话中使用它):

#Ensures Targetdir exists and then copies into it
#Usage: cp_t Targetdir FlagsAndFiles...
cp_t()
( 
    targetdir="$1"; shift || return 1
    [ -d "$targetdir" ] || mkdir -p "$targetdir" || return 1
    exec cp "$@" "targetdir"
)

(这也是POSIX,所以你也应该能够将它与其他POSIX shell一起使用。)