簡體   English   中英

在bash中更改文件擴展名

[英]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}依賴於參數擴展/子字符串移除 這是兩種基本形式。 第一個帶有# expressionLEFT開始從$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM