我們需要將檔案從 filename.dat.dat.dat 重命名為 filename.dat。我們有很多檔案具有相同型別的名稱,擴展名為 .dat.dat.dat
使用以下腳本:
cd /home/riya
for file in filename.dat.dat.dat
do
echo $file
new = "${file:0:12}"
echo $new
mv $file $new
done
給出以下錯誤:
riya.ksh[5]: "${file:0:12}": bad substitution
uj5u.com熱心網友回復:
除非這些檔案名全部由八個字符組成并.dat重復三次,否則最好使用正則運算式來修改它們。像sed這樣的實用程式可以毫無困難地做到這一點。
你的問題有點不清楚這些.dat檔案的位置,但如果它們都在同一個目錄中,那么這應該可以作業:
for f in *.dat.dat.dat
do
g=$(echo $f | sed s/\\.dat\\.dat//)
echo "$f -> $g" ; mv $f $g
done
uj5u.com熱心網友回復:
@r3mainer:您的解決方案是可能的,但它的可行性取決于有多少這樣的檔案:使用 sed (或任何其他外部程式 - awk,tr,...)將需要產生一個完整的新子行程和它的環境對系統造成了很大的負擔。幸運的是,您的 sed 腳本的功能可以通過使用“引數替換”在 shell 中實作。
@riva:首先,您的代碼無法作業,因為變數賦值中不允許有空格:
new = "${file:0:12}" # wrong!
new="${file:0:12}" # correct!
即使是第二個也只能根據您使用的外殼而起作用。例如,ksh88(AIX 中的默認 shell)不會,ksh93(Linux 中唯一的 ksh 版本,在 AIX 中名為“增強型 Korn shell”)會理解這一點。
盡管如此,@r3mainer 的批評仍然成立:這只有在所有檔案名都保證為 8 個字符長的情況下才有效。相反,您可以使用引數替換來獲得您想要的:
new="filename.dat.dat.dat"
echo ${new%%.dat*} # this will yield "filename"
new="${new%%.dat*}.dat" # this will yield "filename.dat"
膨脹${variable%%pattern}切口pattern(在其最長的可能的形式,“貪婪匹配”)從內容的結束variable。由于模式是“.dat*”,這意味著從第一個(任意多個)“.dat”序列開始的所有內容都被剪切。然后在末尾添加一個“.dat”。
此外,請注意,您不應將“for-loops”用于此類活動。“查找”是用于這種目的的命令:
find /some/directory -type f -name "*.dat" -print |\
while read FILE ; do
mv "${FILE}" "${FILE%%.dat*}.dat"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/407638.html
標籤:
