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

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

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

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

まだ存在しないディレクトリに複数のファイルをコピーし、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`

答え2

私は同じ問題があり、tarそれを解決するために使用しました!このように:

tmpfile=/tmp/myfile.tar
files="/some/folder/file1.txt /some/other/folder/file2.txt"
targetfolder=/home/you/somefolder

tar --file="$tmpfile" "$files"​
tar --extract --file="$tmpfile" --directory="$targetfolder"

この場合、tarすべての(サブ)フォルダが自動的に作成されます!最高、

カラフルな蝶

関連情報