2012-01-13 25 views
1

シェルスクリプトを作成して、特定のディレクトリ内のすべてのサブディレクトリを削除しようとしています。私は同じことに簡単なアプローチがあることを知っています。このbash内の特定のフォルダ内のすべてのディレクトリを削除する

find ./ -type d -exec rm -r {} \;
をやってますが、私は同じのためのスクリプトを記述することを好むので、私はシェルスクリプトを勉強していますので、同様に 。私はこのスクリプトを実行すると、ここに私のアプローチは

for i in `ls ./*`; do 
if [ -d $i ];then 
rm -r $i 
fi 
done 

で、これは私に次のエラー

RMを与える:ディレクトリを削除することはできません: `「。

このエラーがこのstops.So私のアプローチのエラーです。私は限り、空白の名前はいくつかの問題を作成する必要があります理解しています。しかし、このスクリプトはこれまでには失敗しています。

答えて

7

ls ./*はの直下のサブディレクトリにあるすべてのファイルのリストを作成します。 -dは、ファイルの名前をチェックしますが、ファイル名と同じです。それが由来するサブディレクトリではありません。例えば

あなたが持っていた場合:

foo1/ 
    bar 
foo2/ 
    baz 

その後、LSは./*バーとバズのリストになるだろう、など./* foo1のとfoo2はにマッチするとLSは、それぞれの内容を一覧表示しますその2つのディレクトリのうちの1つです。

あなたが表示されているエラーメッセージはおそらくあなたのlsがリストされている 'ls -a'にエイリアスされているためです。フロリン氏の答えによれば、ls -A ./*を使ってその問題を回避することができます。 。

あなただけでディレクトリを削除したい場合は、単に実行します。このコマンドで

for i in `ls -A`; do if [ -d $i ]; then rm -r $i; fi; done 
+0

ls ./*というのは、サブディレクトリにあるものを一覧表示するための+1です。 –

0

問題は、現在のフォルダと親フォルダのlsコマンドリストがリンクされていることです。だからあなたのi変数が '。'に設定されているかどうかをテストしなければなりません。または '..'

if [ -d $i ] -a [ $i != '.' ] -a [ $i != '..' ] 
then 
rm -r $i 
fi 
3

...lsの出力には表示されません。

しかし、あなたは

ls -A 

でテストすることができます(-Aは 'ほぼすべて'

-aの意味を意味し 'すべて')

そして:なぜあなたはジュースはfor i in 'ls'を使用していません?

+0

私は明確ではありませんでしたリチャードが説明した何か。 –

3

You shouldn't use lsを。あなただけのディレクトリを反復処理を確実にする非常に単純な方法があります:

for dir in */ 
do 
    echo "$dir" 
done 
+0

FYIでは、/ tmp/foo/* /にある 'for dir 'を実行することもできます。そう... – Eldelshell

0

*/は」すべてのサブディレクトリと一致している必要があり

はこのような何かを試してみてください:

rm -rf /path/to/mySubfolder/*/

関連する問題