我有 20 個檔案,例如:
01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh
...
檔案的名稱具有相似的格式。它們以 01 開頭,具有 01* AAA *.sh 格式。
我希望復制并重命名同一目錄中的檔案,將數字 01 更改為 02、03、04 和 05:
02a_AAA_qwe.sh
02b_AAA_asd.sh
02c_AAA_zxc.sh
02d_AAA_rty.sh
...
03a_AAA_qwe.sh
03b_AAA_asd.sh
03c_AAA_zxc.sh
03d_AAA_rty.sh
...
04a_AAA_qwe.sh
04b_AAA_asd.sh
04c_AAA_zxc.sh
04d_AAA_rty.sh
...
05a_AAA_qwe.sh
05b_AAA_asd.sh
05c_AAA_zxc.sh
05d_AAA_rty.sh
...
我希望將 01*.sh 檔案中的 20 個復制到 02*.sh、03*.sh 和 04*.sh。這將使檔案夾中的檔案總數達到 100。
我真的不知道我怎么能做到這一點。我試圖在 bash 腳本中使用 for 回圈。但甚至不確定我應該選擇什么作為 for 回圈索引。
for i in {1..4}; do
cp 0${i}*.sh 0${i 1}*.sh
done
不起作用。
uj5u.com熱心網友回復:
您不能在單個cp命令中進行多次復制,除非將一堆檔案復制到單個目標目錄。cp不會自動進行名稱映射。通配符由 shell 擴展,命令本身看不到它們,因此它們不可能像這樣進行模式匹配。
要將 1 添加到變數,請使用$((i 1)).
您可以使用 shell 子字串擴展運算子來獲取檔案名前兩個字符之后的部分。
for i in {1..4}; do
for file in 0${i}*.sh; do
fileend=${file:2}
cp "$file" "0$((i 1))$fileend"
done
done
uj5u.com熱心網友回復:
將有很多方法可以將這個切塊...
一種使用for回圈、printf 括號擴展和xargs:
for f in 01*.sh
do
printf "%s\n" {02..05} | xargs -r -I PFX cp ${f} PFX${f:2}
done
同樣的事情,但預先保存printf在一個變數中:
printf -v prefixes "%s\n" {02..05}
for f in 01*.sh
do
<<< "${prefixes}" xargs -r -I PFX cp ${f} PFX${f:2}
done
使用一對for回圈的另一個想法:
for f in 01*.sh
do
for i in {02..05}
do
cp "${f}" "${i}${f:2}"
done
done
從...開始:
$ ls -1 0*.sh
01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh
所有建議的代碼片段都給我們留下了:
$ ls -1 0*.sh
01a_AAA_qwe.sh
01b_AAA_asd.sh
01c_AAA_zxc.sh
01d_AAA_rty.sh
02a_AAA_qwe.sh
02b_AAA_asd.sh
02c_AAA_zxc.sh
02d_AAA_rty.sh
03a_AAA_qwe.sh
03b_AAA_asd.sh
03c_AAA_zxc.sh
03d_AAA_rty.sh
04a_AAA_qwe.sh
04b_AAA_asd.sh
04c_AAA_zxc.sh
04d_AAA_rty.sh
05a_AAA_qwe.sh
05b_AAA_asd.sh
05c_AAA_zxc.sh
05d_AAA_rty.sh
注意:為了可讀性添加了空行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/323186.html
下一篇:為什么當我使用執行緒區域變數呼叫函式時,這個nostdlibC 代碼會出現段錯誤?但不是使用全域變數或當我訪問成員時?
