Linux
(Bash) 重命名文件副檔名
我在嘗試創建腳本以將目錄中的所有文件重命名為
.txt
Linux 時遇到問題。這就是我到目前為止所擁有的。
#!/bin/bash location_number=$(find /hw1/textarchive | wc -l) org_path=/hw1/textarchive/!(*txt) count=0 #for count in $location_number #do # rename $org_path .txt #rename $org_path *.txt # mv $org_path $org_path.txt #done for count in $location_path do rename $org_path .pro .txt *.pro <-----was trying to just rename .pro to .txt (no luck) done echo done
我嘗試使用
mv
,rename
但我一無所獲。當mv $org_path $org_path.txt
我執行時,我會得到一個錯誤(this file) is not a directory
。rename
它將執行沒有任何錯誤,但它不會將任何文件重命名為.txt
.
for name in /hw1/textarchive/*.pro; do newname=${name%.pro}.txt echo mv "$name" "$newname" done
或更短,
for name in /hw1/textarchive/*.pro; do echo mv "$name" "${name%.pro}.txt" done
echo
(當你確定它在做正確的事情時刪除)這將遍歷所有
.pro
文件/hw1/textarchive
並將它們重命名為.txt
文件。${name%.pro}
替換將從中刪除名稱末尾的擴展.pro
名$name
。如果要重命名所有文件:
for name in /hw1/textarchive/*; do echo mv "$name" "${name%.*}.txt" done
將
${name%.*}
刪除名稱末尾的*任何副檔名。*現有.txt
文件也將被處理,但不會更改其名稱。沒有副檔名的文件將獲得新的.txt
副檔名。這也將獲取非文件的名稱(如目錄),因此以下更改將跳過這些:for name in /hw1/textarchive/*; do test -f "$name" || continue echo mv "$name" "${name%.*}.txt" done
確保還沒有具有新名稱的目錄條目可能是謹慎的:
for name in /hw1/textarchive/*; do test -f "$name" || continue test -e "${name%.*}.txt" && continue echo mv "$name" "${name%.*}.txt" done
在另一種等效形式上:
for name in /hw1/textarchive/*; do if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then echo mv "$name" "${name%.*}.txt" fi done
-f
測試測試給定的正常文件是否存在。該-e
測試測試給定名稱的存在(無論它是什麼名稱)。這個解決方案不需要
bash
(只是一個sh
兼容的外殼)。