
私は読むファイルをコピーすると同時にターゲットディレクトリを作成するにはどうすればよいでしょうか?
しかし、この解決策はコピーしたい場合にのみ有効です1つファイル。
まだ存在しないディレクトリに複数のファイルをコピーし、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 は最後のパラメータに対応します。スペースは必須です。スペースがなければ、形式になります${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
すべての(サブ)フォルダが自動的に作成されます。よろしくお願いします。
ナビ