小文字のファイル名をawk/sed/bashで大文字に変更したい
あなたの助けをいただければ幸いです
aaaa.txt
vvjv.txt
acfg.txt
希望する出力
AAAA.txt
VVJV.txt
ACFG.txt
序文:
拡張機能の大文字と小文字を気にしない場合は、シェル ループで 'tr' ユーティリティを使用するだけです。
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
拡張機能の大文字と小文字を気にする場合は、それを行う方法が複数あることに注意してください ( TIMTOWTDI )。個人的には、ここにリストされているPerlソリューションは、おそらく Linux で最も単純で柔軟なソリューションだと思います。複数のファイル拡張子がある場合は、変更しない番号を指定するだけです。BASH4ソリューションも非常に優れたソリューションですが、拡張機能を数回書き出すか、別の変数を使用して格納する必要があります。しかし、深刻な移植性が必要な場合は、8進数を使用するこの回答の最後のソリューションをお勧めします。Linux の一部のフレーバーには、renameと呼ばれるツールも付属しています。それもチェックする価値があるかもしれません。使用方法はディストリビューションによって異なるため、詳細を入力man rename
してください。
解決策:
Perl の使用:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
BASH4 の使用:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
GNU awk の使用:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
GNU sed の使用:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
BASH3.2 の使用:
for i in *.txt; do
stem="${i%.txt}";
for ((j=0; j<"${#stem}"; j++)); do
chr="${stem:$j:1}"
if [[ "$chr" == [a-z] ]]; then
chr=$(printf "%o" "'$chr")
chr=$((chr - 40))
chr=$(printf '\'"$chr")
fi
out+="$chr"
done
mv "$i" "$out.txt"
out=
done
一般に、小文字/大文字の変更には "tr" (文字の変換) ユーティリティがよく使用されます。これは、文字の置換に使用されるコマンド ライン ユーティリティのセットからのものです。
dtpwmbp:~ pwadas$ echo "xxx" | tr '[a-z]' '[A-Z]'
XXX
dtpwmbp:~ pwadas$
また、ファイルの名前を変更するために、perl ( man rename ) で提供される「rename」ユーティリティがあります。
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in
Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line,
filenames will be read via standard input.
For example, to rename all files matching "*.bak" to strip the extension, you might say
rename 's/\.bak$//' *.bak
To translate uppercase names to lower, you'd use
rename 'y/A-Z/a-z/' *
rename
拡張子ではなくファイル名のみを大文字にしたい場合は、次のようなものを使用することをお勧めします。
rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
\U
までのすべてを大文字にします。 perlreref(1)\E
を参照してください。出力に満足したら、 を削除します。-n
単純に使用します(端末で):
for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done;
Bash 4 parameter expansion can perform case changes:
for i in *.txt; do
i="${i%.txt}"
mv "$i.txt" "${i^^?}.txt"
done
for f in *.txt; do
mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt"
done
バッシュ:
for f in *.txt; do
no_ext=${f%.txt}
mv "$f" "${no_ext^^}.txt"
done
より簡単で軽量で移植可能なアプローチは次のとおりです。
for i in *.txt
do
fname=$(echo $i | cut -d"." -f1 | tr [a-z] [A-Z])
ext=$(echo $i | cut -d"." -f2)
mv $i $fname.$ext
done
すべての Unix フレーバーに見られる最も一般的な外部ユーティリティ (cut、tr) を使用しているため、これはほぼすべてのバージョンの BASH で機能します。
これはうまくいくかもしれません(GNU sed):
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /' | sh
またはもっと簡単に:
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /e'
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done;
これは私にとってはうまくいきます。