forループを使用してディレクトリ内のすべてのエントリを削除します。

forループを使用してディレクトリ内のすべてのエントリを削除します。

次のコマンドを使用して、サーバーから大量のメールを削除しようとしています。 (主にメールは送信されません。)

 rm -rf /home/*/mail/new/*

私はますます-bash: /usr/bin/rm: Argument list too long

検索を試してみました。

find /home/*/mail/new/ -mindepth 1 -delete

しかし、20分が経っても何も起こらないようです。

forループを使用してその中のすべてのもの(ディレクトリ、ファイル、ドットファイル)を削除する方法/home/*/mail/new/

このような

for f in /home/*/mail/new/*.*~; do
        # if it is a file, delete it
    if [  -f $f ]
    then
        rm "$f"
    fi
done

ファイルとフォルダ、およびその中のすべての内容を削除するには、このコマンドを再作成するのに役立ちます。/home/*/mail/new/

編集:私の質問はFORループ内でこれを行うという点でユニークです。

ベストアンサー1

問題は、あまりにも/home/*/mail/new/*多くのファイル名に拡張されることです。最も簡単な解決策は、ディレクトリを削除することです。

rm -rf /home/*/mail/new/

またはfindコマンドを使用します。可能でなければなりませんが、遅くなります。

または、ディレクトリが必要な場合は、newループを使用してそのディレクトリを見つけて削除し、再作成します。

for d in /home/*/mail/new/; do
    rm -rf "$d" && mkdir "$d"
done

作成したいループ(しかし使用しないでください。非常に遅くて非効率的です)は次のとおりです。

for f in /home/*/mail/new/* /home/*/mail/new/.*; do
    rm -rf "$f"
done

すべてを削除するためにファイルをテストする必要はありません。rm -rf同じコマンドを使用してディレクトリとファイルの両方を削除するだけです。削除できないと文句があります...無視できます。または、非常にきれいでエラーを回避するには、bashで次のことを実行できます。

shopt -s dotglob
for f in /home/*/mail/new/*; do
        rm -rf "$f"
done

おすすめ記事