(Bash) ファイル拡張子の名前変更

(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試してみましたがrename結果はありません。実行すると、mv $org_path $org_path.txt同様のエラーが発生します(this file) is not a directory。これを使用するとrename、実行時にエラーは発生しませんが、ファイル名を.txt

答え1

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テストは、与えられた名前が存在するかどうかをテストします。

このソリューションには1つも必要ありませんbashsh互換性のあるシェルのみが必要です)。

関連情報