2011-11-15 6 views
2

私はbashスクリプトを書くのは恐ろしいですが、再帰的にディレクトリをループし、そこにあるすべてのファイルの名前を "1.png"、 "2"に変更できるのでしょうか? png "などですが、新しいフォルダが入るたびに再起動する必要があります。ここで動作するスクリプトは1つのディレクトリに対してのみ実行されます。事前Bashはディレクトリをループしてすべてのファイルの名前を変更します

EDIT

cd ./directory 
cnt=1 
for fname in * 
do 
    mv $fname ${cnt}.png 
    cnt=$(($cnt + 1)) 
done 

おかげで誰もが実際にこのコードを書き出すことはできますか?私はどのようにbashを書くのか分かりません。それは非常に混乱します。

+0

$ fnameごとにテストを追加し、ディレクトリであるかどうかを確認してから、新しいディレクトリをcdターゲットとして再度呼び出します。また、これが何らかの大きさであれば、$ cnt値の前に00の前置文字列を管理することなく、001-999のような数字を(先行ゼロで)生​​成することができます。それ以外の場合は、1.png 10.png 2.pngのソート方法を理解しようとしています。幸いです。 – shellter

+0

ソートは問題ではなく、ソートする理由は決してありませんが、私は実際にこれを書く人を探しています.bashを書く方法がわからず、迷っています。 –

答えて

3

findを使用するとよいでしょう。

find /directory -type d -exec youscript.sh {} \; 

-type dパラメータを使用すると、ディレクトリのみ

-exec youscript.shを見つけたい意味:あなたは、ディレクトリ内のすべてのディレクトリを検索し、見つかったディレクトリにスクリプトを適用するには、次の構文で検索を使用することができます{} \;見つかったディレクトリごとにスクリプトを開始し、このディレクトリ名をパラメータとして渡します。

+0

ありがとうございました!それは驚くほどうまくいった。それは元のフォルダが含まれていましたが、簡単な条件付きで修正しました –

+0

'-mindepth 1'パラメータを使用して親フォルダを除外できますが、findにはこのパラメータを指定できませんでした。マニュアルページでfindコマンドを探してください。 – stee1rat

1

find(1)を使用して、ファイルのリストを取得し、そのリストで好きなことをしてください。

+0

申し訳ありませんが、私はそれが何を意味するのかわかりませんD: –

+0

@stumpx - あなたは 'find'のマニュアルページを読んだことがありますか?どのような質問がありますか?スクリプト内の '*'を 'find'とその引数の組み合わせで置き換えてください。あなたの場合は、おそらく '$(find。-type f)'です。ファイル名に空白がないか注意してください。あなたの元のスクリプトはそれを正しく処理しません。 –

+0

別の問題は、フォルダに移動してファイル名を変更するのではなく、フォルダの名前を変更することです –

関連する問題