[英]Changing file extension in bash
您好,我必須更改文件擴展名,但是我在調用腳本時必須輸入文件擴展名
所以我嘗試
#!/bin/bash
echo "Hello "
roz1="$1"
roz2="$2"
katalog="$3"
for i in `find . -name '*$roz1'`
do
tmp=`basename $i $roz1t`
mv "${tmp}$roz1" "${tmp}$roz2"
done
當我將其更改為/.script .txt .html時,
#!/bin/bash
echo "Hello "
roz1="$1"
roz2="$2"
katalog="$3"
for i in `find . -name '*.txt'`
do
tmp=`basename $i .txt`
mv "${tmp}.txt" "${tmp}.html"
done
所有工作文件,我都知道它是錯誤的變量$ 1 $ 2 call,但我無法修復它。
有幾種快速簡便的方法可以解決此問題。 根據您的嘗試,我們從命令行獲取當前和新的擴展名。 然后,您需要驗證2個輸入,然后刪除前導'.'
(如果有的話)位於每個擴展名的前面,以便能夠始終如一地處理帶有或不帶有前導點的用戶輸入。
然后,只需按擴展名選擇文件,然后在刪除不需要的擴展名並附加新擴展名的同時移動即可。 這可以使用子字符串提取在一個調用中全部完成:
#!/bin/bash
[ -z $1 -o -z $2 ] && { ## validate both extensions given
printf "error: insufficient input. usage: %s ext1 ext2\n" "${0//*\//}"
exit 1
}
ext1="$1" ## assign input to variables
ext2="$2"
## remove leading '.' if it exists
# allows handling with/without '.'
[ ${ext1:0:1} = . ] && ext1=${ext1:1}
[ ${ext2:0:1} = . ] && ext2=${ext2:1}
## read each file in list
while read -r fname; do
## simple move from ext1 to ext2 using substring extraction
mv "$fname" "${fname%.$ext1}.$ext2"
done < <(find . -type f -name "*.$ext1")
exit 0
說明
${var#expression}
或${var%expression}
依賴於參數擴展/子字符串移除 。 這是兩種基本形式。 第一個帶有#
expression
從LEFT開始從$var
刪除expression
第一次出現的內容。 %
變體從RIGHT開始。 使用##
或%%
表示刪除$var
中所有出現的表達式。 因此, "${fname%.$ext1}.$ext2"
表示從完整文件名$fname
(從右起-僅保留文件名不帶擴展名)中刪除$ext1
(第一個擴展名)的內容,然后添加.$ext2
(新擴展名)結尾(創建新文件名)。 例:
$ a=file.txt; echo ${a%.txt}; echo ${a%.txt}.html
file
file.html
${ext1:0:1}
類型是簡單的字符串索引表達式。 它們是${var:start:length}
(如果沒有length
,則默認為從string的開始到結尾 )。 因此ext1=${ext1:1}
只是說跳過第一個字符並復制剩余的字符 。 (如果是'.'
則基本上刪除第一個字符)。 您也可以從頭開始索引,但是語法很特殊。 要從末尾開始索引,請使用${var: -4:1}
( 請注意: -4
之間的空格 ),也可以使用括號${var:(-4):1}
。 兩者都從末尾開始4個字符,並得到1個字符(例如, file.txt
的.
)。 例:
$ a=file.txt; b=file.txt; echo ${a: -4:1}; echo ${b:(-4):1}
.
.
完整腳本的測試文件
$ ls -1
chext.sh
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
使用/結果
將.txt擴展名更改為.html:
$ bash chext.sh txt html
$ ls -1
chext.sh
file1.html
file2.html
file3.html
file4.html
file5.html
您應該閱讀有關報價的信息 。
find . -name '*$roz1'
find . -name '*$roz1'
實際上將與文字$ roz1匹配,因此不會擴展。
您應該使用雙引號,如find . -name "*$roz"
find . -name "*$roz"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.