我正在撰寫一個 bash 腳本來將一個或多個或所有檔案復制到目標,如果目標不存在則創建目標。
我已經完成了這個解決方案,但它沒有滿足我的要求。
我的代碼(這對于 idk 什么原因不起作用):
# copy files and make a directory if does not exist
mkcp() {
# last argument is destination
dir="${@: -1}"
# create directory if does not exist
mkdir -p "$dir"
# loop over all arguments
for file in "$@"
do
# if file is last argument (directory) then break loop
if [ "$file" == "$dir" ]; then
break
fi
# else keep copying files
cp -R "$file" "$dir"
done
}
我希望所有這些命令都能正常作業:
# copies "text.txt" to "testdir" (testdir may or may not exist so it must be created first)
$ mkcp test.txt ~/desktop/testdir
# copies "test1.txt" and "test2.txt" to "testdir" (conditions are same)
$ mkcp test1.txt test2.txt ~/desktop/testdir
# copies "all files" to "testdir" (conditions are same)
$ mkcp * ~/desktop/testdir
如果有任何其他解決方案可以滿足我的要求,我也可以。
注意:mkcp函式存盤在.zshrc.
uj5u.com熱心網友回復:
您假設最后一個引數必須是一個目錄,如果不存在這樣的目錄,則應該創建它。在 zsh 中,我會這樣做:
mkcp() {
local destdir=$@[-1]
if [[ -f $destdir ]]
then
echo Missing destination directory 2>&1
return 1
else
mkdir -p $destdir
if [[ -d $destdir ]]
then
cp "$@"
else
echo Can not create $destdir
return 1
fi
fi
}
問題不在于復制(普通cp命令可以做到,不需要回圈),所以這里的重點是錯誤檢查。
請注意,使用我的方法,開關可以隱式傳遞給cp,例如
mkcp -r foo bar baz
也遞回地復制子目錄,并且
mkcp -rv foo bar baz
另外列印復制的檔案的名稱。
uj5u.com熱心網友回復:
在我意識到這是一個 zsh 問題之前,我添加了這個 bash 答案。不洗掉它,希望其他人覺得它有用。
您可以使用${var:offset:length}擴展獲取位置引數的子串列。請參閱手冊中的Shell 引數擴展。
也許是這樣:
mkcp() {
local dir="${@: -1}"
mkdir -p "$dir"
for file in "${@:0:$#}" # all but last
do
cp -vR "$file" "$dir"
done
}
事實上,它可以更簡單,假設你有 GNU cp-t選項:
mkcp() {
local dir="${@: -1}"
mkdir -p "$dir"
cp -t "$dir" -vR "${@:0:$#}"
}
我添加了 cp 的-v選項以獲得額外的詳細資訊,因此您可以看到正在復制哪些檔案。
uj5u.com熱心網友回復:
這就是我建議的主要更改應該是這樣的:
mkcp() {
# last argument is destination
dir="${@: -1}"
# create directory if does not exist
mkdir -p "$dir"
# loop over all arguments
for file in "$@"
do
# if file is last argument (directory) then break loop
if [ "$file" == "$dir" ]; then
break
fi
# else keep copying files
cp -R "$file" "$dir"
done
}
我不清楚你是如何得到錯誤資訊的mkcp:9: = not found;要除錯它,我需要查看您修改后的代碼。OTOH,我不相信除錯會特別有建設性。
uj5u.com熱心網友回復:
錯誤在此命令上
# copies "all files" to "testdir" (conditions are same)
$ mkcp * ~/desktop/testdir
您將字串“*”作為命令傳遞給自定義函式,因此當您發送 *mkcp * 時,您實際上是在說“cp -R * /path”,其中 * 只是一個字串,而不是“全部”。
您可以嘗試這樣做:
mkcp() {
# last argument is destination
dir="${@: -1}"
# create directory if does not exist
mkdir -p "$dir"
# loop over all arguments
for file in "$@"
do
if [[ "${file}" == "*" ]]; then
LIST_FILE=$(ls $dir)
for i in $LIST_FILE
do
cp $i $dir
done
break
fi
# if file is last argument (directory) then break loop
if [ file == "$dir" ]; then
break
fi
# else keep copying files
cp -R "$file" "$dir"
done
}
如果您需要“除錯”腳本正在執行的內容,請嘗試將腳本運行為:
bash -x mkcp * ~/desktop/testdir
-x 將如何執行腳本的每一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/458973.html
上一篇:通過ansible從串列中安裝包
