複製多個檔案並同時建立目標目錄?

複製多個檔案並同時建立目標目錄?

我讀如何在複製檔案的同時建立目標目錄?

但那裡的解決方案只有在你想複製時才有效文件。

如何將多個檔案複製到尚不存在的目錄中,並使用一個命令自動建立它?

例如:

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將自動為您建立所有(子)資料夾!最好的,

彩蝶

相關內容