Linux

(Bash) 重命名文件副檔名

  • September 15, 2017

我在嘗試創建腳本以將目錄中的所有文件重命名為.txtLinux 時遇到問題。

這就是我到目前為止所擁有的。

#!/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

我嘗試使用mvrename但我一無所獲。當mv $org_path $org_path.txt我執行時,我會得到一個錯誤(this file) is not a directoryrename它將執行沒有任何錯誤,但它不會將任何文件重命名為.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兼容的外殼)。

引用自:https://unix.stackexchange.com/questions/392450