簡體   English   中英

使用 shell 腳本更改文件擴展名

[英]Change extension of file using shell script

如何將目錄中所有 *.dat 文件的擴展名更改為 *.txt。 Shell 腳本應將目錄名稱作為參數。 可以取多個目錄為 arguments。 使用日期和時間戳以附加模式打印命令結果的日志。

批處理文件在Unix中通過文件擴展名重命名

# change .htm files to .html
for file in *.htm ; do mv $file `echo $file | sed 's/\(.*\.\)htm/\1html/'` ; done

# change .html files to .htm
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1htm/'` ; done

#change .html files to .shtml
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1shtml/'` ; done

#change .html files to php
for file in *.html ; do mv $file `echo $file | sed 's/\(.*\.\)html/\1php/'` ; done

所以==>

# change .dat files to .txt
for file in *.dat ; do mv $file `echo $file | sed 's/\(.*\.\)dat /\1txt/'` ; done

Bash可以完成所有繁重的工作,例如提取擴展和標記新的擴展。 例如:

for file in $1/*.dat ; do mv "$file" "${file%.*}.txt" ; done
#!/bin/bash
for d in $*; do
    for f in $(ls $d/*.dat); do
        echo $(date) $(mv -v $f ${f%.dat}.txt)
    done
done

運行腳本時,shell應該完成輸出重定向

退出參數有效性檢查

簡單的腳本:

#!/bin/bash

if [ $# -lt 2 ] then
    echo "Usage `basename $0` <any number of directories space separated>"
    exit 85              # exit status for wrong number of arguments.
fi

for directories
do
    for files in $(ls $directories/*.dat); do
        echo $(date) $(mv -v $files ${files%.dat}.txt)
    done
done

傳遞的$@ ie命令行參數默認循環第一個for循環。

按照Pben的解決方案,如果你的文件名包含空格,你應該對變量使用雙引號,如下所示:

#remove the space in file name
#example file name:19-014-0100.mp3 .mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/ //g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;

#remove the duplicate file extension in file name
#example file name:19-014-0100.mp3.mp3
#result file name:19-014-0100.mp3
$ for file in *.mp3 ; 
    do target=`echo "$file" | sed 's/\.mp3\.mp3$/.mp3/g'`;
    echo "$target"; 
    mv "$file" "$target"; 
done;

腳本,首先找到給定擴展名。 它從名稱中刪除了擴展名。 然后添加反斜杠()以識別終端。

然后執行'mv'命令。 這里'.temp'文件夾用於在GUI中隱藏用戶進程。

#!/bin/sh
if [ $# -ne 3 ] 
then
    echo "Usage:  ./script folder current_extension modify_extension"
    exit
fi
mkdir .temp
find $1 -name "*.$2" > .temp/output_1 && sed "s/$2//" .temp/output_1 > .temp/output_2 && sed -e "s/[ \t]/\\\ /g" .temp/output_2 > .temp/output_3
while read line
do
    mv -v "$line""$2" "$line""$3"
done < .temp/output_3
rm -rf .temp

輸出文件保存在'.temp'文件夾中,稍后刪除'.temp'文件夾。

最高投票的答案並不適合我。 我可能做錯了什么。 我的方案是嘗試創建一個具有原始名稱的文件,但附加了日期,同時將擴展名從.xslx更改為.csv。 這對我有用:

csvname=`echo $xlsx |sed 's/\.xlsx//'`"-$now"`echo $xlsx | sed 's/\(.*\.\)xlsx/\.csv/'`

因此,對於目錄中的所有.dat文件(沒有添加日期),您可以運行以下內容:

for i in *.dat
do mv $i `echo $i |sed 's/\.dat//'``echo $i | sed 's/\(.*\.\)dat/\.txt/'`
done

從上面可以看出,這段代碼只刪除了擴展名:

echo $i |sed 's/\.dat//'

此部分將.dat更改為.txt:

echo $i | sed 's/\(.*\.\)dat/\.txt/'

通過將它們彼此相鄰碰撞,它將兩個輸出連接成文件名。 就像這樣做:

mv [filename][.dat] [filename] + [.txt]

雖然,我確實使用STDOUT而不是'mv'命令。

按照命令將文件擴展名.c更改為.h

find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"

要重命名(更改擴展名)epub文件上的所有html文件,我使用此命令行:

find . -name "*.html*" -exec rename -v 's/\.html$/\.epub/i' {} \;

將 js 遞歸地更改為 cjs 擴展文件:

cd dist # where you place your .js
for file in $(find . -type f -name "*.js"); do mv "$file" "${file%.*}.cjs"; done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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