私は読んだファイルのコピー中にターゲットディレクトリを作成する方法は?
しかし、そこの解決策はコピーしたい場合にのみ機能します。一つ文書。
まだ存在しないディレクトリに複数のファイルをコピーし、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}"
パフォーマンスに関しては、eval
bash 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
すべての(サブ)フォルダが自動的に作成されます!最高、
カラフルな蝶