
但那裡的解決方案只有在你想複製時才有效一文件。
如何將多個檔案複製到尚不存在的目錄中,並使用一個命令自動建立它?
例如:
cd /tmp/
mkdir a/
cd a/
touch x1 x2
cp --magic * ../b/c/d/
所以最後這兩份文件的順序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 快得多);而有解決方案的 dash 5.7 eval
(不支援另一種)比有解決方案的 ksh93 快一點"${@: -1}"
。因此,根據您的情況(腳本、互動式使用、對特定 shell 功能的支援等),做出選擇...但請注意,在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
將自動為您建立所有(子)資料夾!最好的,
彩蝶