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

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

私は読むファイルをコピーすると同時にターゲットディレクトリを作成するにはどうすればよいでしょうか?

しかし、この解決策はコピーしたい場合にのみ有効です1つファイル。

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

例えば:

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

最終的に、 2 つのファイルx1x2次のように順序付けられます。

/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 は最後のパラメータに対応します。スペースは必須です。スペースがなければ、形式になります${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 よりもはるかに高速です)。また、このevalソリューションを使用した dash 5.7 (他のソリューションはサポートされていません) は、この"${@: -1}"ソリューションを使用した ksh93 よりも少し高速です。したがって、ケース (スクリプト、対話型使用、特定のシェル機能のサポートなど) に応じて選択してください... ただし、ほとんどの時間がかかる のコンテキストでは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すべての(サブ)フォルダが自動的に作成されます。よろしくお願いします。

ナビ

関連情報