2017-07-21 10 views
1

私のワークフローには次のような典型的な問題があります。まだ作成されていないディレクトリにいくつかのファイルをコピーします。ほとんどの場合、私はこの方法でそれを実行します。コマンド展開でディレクトリを作成する:引用問題

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が実行され、ディレクトリが作成され、そのパスでバッククォートに置き換えられますn <ENTER>を押してcpを実行します。

新しいディレクトリのパスに空白がない限り、すべて正常に動作します。その場合、展開後、コマンドラインにエスケープされていないスペースがあります。

私は(mdで)このような引用符でパスを置くことによってこれを克服しようとした:

echo "'$*'" 

しかし、この場合に拡張した後、私は引用符をエスケープしています

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

がいずれかがありますzshのコマンド拡張に関する引用符の逃げを避ける方法はありますか?私は$()と異なるタイプの引用符('の代わりに")を試しましたが、何も動作しません。もちろん

、私はこの方法でそれを行うことができます。

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

しかし、私は、可能な場合、キーストロークのカップルを保存したいです。

+2

はあなただけ最初に対象ディレクトリを作成し、 'mdcp'を作ることによって、その周りに働いて考えがあります?バックティックでなくても、引用符を使用する必要はありません。 (複数のコマンドで動作させたい場合は、代わりに 'md cp ..'や' md mv'を実行し、コマンドを実行する前に最後のパラメータを作成することができます) –

+0

@thatotherguy良いアイデア、引用符の問題を解決することはできません... –

+1

おそらく 'rsync * .jpg/some/new/dir /'でしょうか? 'rsync'が存在しなければ' rsync'はコピー先のディレクトリを作成します... – twalberg

答えて

1

これを解決する最も簡単な方法は、スクリプト/関数をすべて作成することです(私は、おそらく対話的なシェルセッションからのみ使用するため、関数を好むでしょう):

#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 "[email protected]" "targetdir" 
) 

(これはあまりにもPOSIXあるので、あなたは、他のPOSIXシェルでそれを使用することができるはずです。)

関連する問題