2016-07-29 6 views
0

名前が大文字であるカレントディレクトリのすべてのファイルの名前をすべて小文字に変更するシェルスクリプトを試しています。たとえば、ディレクトリにCoUnt.cという名前のファイルが含まれている場合は、count.cに名前を変更する必要があります。名前が大文字のすべての小文字に一致する現在のディレクトリのすべてのファイルの名前を変更します。

for f in *; 
do 
if [ -f "$f" ]; then 
tr 'A-Z' 'a-z' 
fi 
done 

しかし、動作しません。 これにはより良い解決策がありますか?

+0

try、http://stackoverflow.com/questions/20253584/linux-rename-files-to-uppercase –

答えて

2

問題はtrstdinの値を受け入れます。したがって、各ファイル名に下に上位変換するためには、あなたのような何かができる:

#!/bin/sh 

for f in * 
do 
    [ -f "$f" ] || continue 
    flc=$(echo "$f" | tr 'A-Z' 'a-z')   ## form lower-case name 
    [ "$f" != "$flc" ] && echo mv "$f" "$flc" 
done 

(注:操作に満足している後echomv前に、実際にファイルを移動する削除)

2

trプログラムにデータを渡すことはなく、出力もキャプチャしていません。

あなたがshを使用している場合:

for f in *[A-Z]* 
do 
    if [ -f "$f" ]; then 
     new_name=$(echo "$f"|tr 'A-Z' 'a-z') 
     mv "$f" "$new_name" 
    fi 
done 

注インデント - それは読みやすいコードになります。

あなたはtrのような外部プログラムを使用する必要がないbashを使用している場合は、bashの拡張使用することができます。

for f in *[A-Z]* 
do 
    if [[ -f $f ]]; then 
     new_name=${f,,*} 
     mv "$f" "$new_name" 
    fi 
done 
+0

bashismsで不正行為はありません! ';-)'しかし、私は最初に大文字を含むファイル名の限界が好きです。 –

+1

@ DavidC.Rankin:公平ですが、最初にPOSIXソリューションを提供しました:-) – cdarke

1

を次のコードは正常に動作します。

for f in * 
do 
if [ -f $f ]; then 
    echo "$f" | tr 'A-Z' 'a-z' >/dev/null 
fi 
done 
2

私はここに投稿コメントを追加することができませんので、 はSED使用され、それが私の作品

#!/ binに/ bashの

for i in * 
do 
if [ -f $i ] 
then 
kar=$(echo "$i" | sed 's/.*/ \L&/') 
mv "$i" "$kar" 
done 
+0

ファイル名に空白が含まれている場合は、変数へのすべてのアクセスを二重引用符で囲む必要がありますので、 '' $ i "'と '" $ kar "。 –

1

それは簡単ですので、私はrenameをお勧めします効率的で、2つの異なるファイルが同じ結果に解決されたときにも衝突をチェックします:

Perl正規表現で使用することができます:

rename 'y/A-Z/a-z/' * 

hereがあります。

+0

'rename(1)'はLinuxに固有のものであり、すべてのバージョンが表示されているオプションをサポートするわけではありません。 – cdarke

+0

@cdarke AFAIKは、Perlがインストールされている場合、Linux、Unix、OS XおよびWindows上で動作するPerlスクリプトです。私が提案した2番目の書式/構文は、これらすべてのプラットフォームでサポートされていると思います。 –

+0

renameコマンドはCで書かれています。これはutil-linuxパッケージの一部で、ftp://ftp.kernel.org/pub/linux/utils/util-linux/から入手できます。カーネルインタフェース 'rename(2)'は基礎となるAPIであり、その名前でPerlビルトインがありますが、これはそうではありません。私はPerlがインストールされたOS Xで動作していますが、コマンドラインユーティリティの名前は変更されていません。 – cdarke

関連する問題