(Bash) 重命名文件扩展名

Pai*_*kes 3 linux bash rename files

我在尝试创建脚本以将目录中的所有文件重命名为.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
Run Code Online (Sandbox Code Playgroud)

我尝试使用mvandrename但没有任何结果。当mv $org_path $org_path.txt我运行时,我会收到类似于 的错误(this file) is not a directory。有了rename它,运行时不会出现任何错误,但它不会将任何文件重命名为.txt.

Kus*_*nda 5

for name in /hw1/textarchive/*.pro; do
    newname=${name%.pro}.txt
    echo mv "$name" "$newname"
done
Run Code Online (Sandbox Code Playgroud)

或者更短,

for name in /hw1/textarchive/*.pro; do
    echo mv "$name" "${name%.pro}.txt"
done
Run Code Online (Sandbox Code Playgroud)

echo当您确定它正在做正确的事情时删除)

这会迭代.pro下面的所有文件/hw1/textarchive并将它们重命名为.txt文件。替换将从中的名称末尾${name%.pro}删除扩展名。.pro$name


如果要重命名所有文件:

for name in /hw1/textarchive/*; do
    echo mv "$name" "${name%.*}.txt"
done
Run Code Online (Sandbox Code Playgroud)

${name%.*}将删除名称末尾的任何扩展名。现有.txt文件也将被处理,但不会更改其名称。没有扩展名的文件将获得新的.txt扩展名。这还将获取非文件的名称(如目录),因此以下更改将跳过这些名称:

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    echo mv "$name" "${name%.*}.txt"
done
Run Code Online (Sandbox Code Playgroud)

谨慎的做法可能是确保不存在具有新名称的目录条目:

for name in /hw1/textarchive/*; do
    test -f "$name" || continue
    test -e "${name%.*}.txt" && continue
    echo mv "$name" "${name%.*}.txt"
done
Run Code Online (Sandbox Code Playgroud)

在另一种等效形式上:

for name in /hw1/textarchive/*; do
    if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then
        echo mv "$name" "${name%.*}.txt"
    fi
done
Run Code Online (Sandbox Code Playgroud)

-f测试测试给定常规文件是否存在。该-e测试测试给定名称是否存在(无论它是什么名称)。

该解决方案不需要bash(仅sh需要兼容的外壳)。