複数のファイルをコピーし、同時にターゲットディレクトリを作成しますか?

複数のファイルをコピーし、同時にターゲットディレクトリを作成しますか?

私は読んだファイルのコピー中にターゲットディレクトリを作成する方法は?

しかし、そこの解決策はコピーしたい場合にのみ機能します。一つ文書。

まだ存在しないディレクトリに複数のファイルをコピーし、1つのコマンドで自動的に作成するにはどうすればよいですか?

たとえば、

cd /tmp/
mkdir a/
cd a/
touch x1 x2
cp --magic * ../b/c/d/

したがって、これら2つのファイルの最終順序x1は次のとおりですx2

/tmp/b/c/d/x1
/tmp/b/c/d/x2

ベストアンサー1

使用:

$ copy() { mkdir -p -- "${@: -1}" && cp -- "$@" ; }
$ copy * ../b/c/d/

注:bash、ksh93、およびzshで動作します。

"${@: -1}"${parameter:offset}オフセットで始まるすべての引数型に対応します。オフセット-1は最後の引数に対応します。負のオフセットは最後から計算されるからです。スペースが必要で、それ以外の場合はformです${parameter:-word}。詳細については、bashのマニュアルを参照してください。

"$@"正確に必要なパラメータのリストに展開されますcp

注2:mikeservが提案したように、次のものを使用できます。

eval 'mkdir -p -- "${'"$#"'}"'

以下より移植性が優れています(POSIX)。

mkdir -p -- "${@: -1}"

パフォーマンスに関しては、evalbash 4.3.30を使用するソリューションははるかに高速ですが、ksh 93u +とzsh 5.0.6を使用する他のソリューションははるかに高速です(ksh93とzshはどちらの場合もbashよりはるかに高速です)。ソリューションでは、ダッシュ5.7が使用されますeval。他のものをサポートしていません)ソリューションを使用すると、ksh93より少し高速です"${@: -1}"。そのため、状況(スクリプト、対話型の使用、特定のシェル機能のサポートなど)に応じて選択してください。ただし、cp(ほとんどの時間がかかる)コンテキストでは、これらのパフォーマンスの違いは発生しません。目にさらされません。

テストに使用するスクリプト:

i=50000
while [ $i -ne 0 ];
do
  # : "${@: -1}"
  eval ': "${'"$#"'}"'
  i=$((i-1))
done

(対応する行をコメントアウトし、eval他の解決策については前の行のコメントを削除します)、次のように呼び出されます。

time sh ./tst `seq 1000`
time bash ./tst `seq 1000`
time ksh93 ./tst `seq 1000`
time zsh ./tst `seq 1000`

おすすめ記事