我的工作流程存在以下典型问题:我想将一些文件复制到尚未创建的目录中。大多数情况下我是这样做的:
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`"
但是如果可能的话,我想保存几次击键。
答案 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一起使用。)