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つも必要ありませんbash
(sh
互換性のあるシェルのみが必要です)。