微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – (Bash)重命名文件扩展名

我在尝试创建脚本以将我的目录中的所有文件重命名Linux上的.txt时遇到问题.

这就是我到目前为止所拥有的.

#!/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并重命名,但我无处可去.使用mv $org_path $org_path.txt当我运行时,我会得到一个错误(这个文件)不是一个目录.使用重命名它将运行没有任何错误,但它不会将任何文件重命名为.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

(当你确定正在做正确的事情时,删除回声)

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

如果要重命名所有文件

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 test测试给定常规文件的存在. -e测试测试给定名称的存在(无论它的名称是什么).

解决方案不需要bash(只是sh兼容的shell).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐