ディレクトリのコンテンツのみを削除する方法は?


14

私はフォルダーにいます:/var/myfolder

内部には、次のような他のフォルダーがあります/var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/

それぞれの中に、ランダムな名前のファイルがいくつかあります。内部のすべてのフォルダーからすべてのファイルを削除するにはどうすればよい/var/myfolderですか?

構造(内部のすべてのディレクトリ(A、B、Cなど/var/myfolder)など)はそのままにしておく必要があります。

回答:


17

試してください:

find /var/myfolder -type f -delete

これにより、/ var / myfolderの下にあるすべての通常ファイルが取得され、ディレクトリのみが残されて削除されます。


解決策をありがとう。Solaris 9でこれを実行していることに言及する必要があります。したがって、findには-deleteオプションがありませんが、それは良い出発点です。
-IroeN

2
次の解決策を思いつくことができました:find / var / myfolder -type f -exec rm -f {} \;
-IroeN

2
ごめんなさい。DebianまたはUbuntuを使用しています。私の知る限り、あなたのソリューションは同等です。
-StarNamer

6
-type f!=! -type d
mikeserv

7

zshでは、. glob修飾子を使用して、通常のファイルのみを照合します。

rm -- **/*(.)

これにより、現在のディレクトリとそのサブディレクトリ内のすべての(隠されていない)通常のファイルが再帰的に削除されます。Dglob修飾子を追加して、非表示の通常ファイル(および非表示ディレクトリ内の通常ファイル)も削除します。


私はbashを使用しています。
-IroeN

1
@ user6554:...あなたの質問も使用されたタグも示さない;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm ディレクトリを削除しないので、すべてに対して実行するだけです。

ディレクトリへのシンボリックリンクを保持するには:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

上記のバージョンでテストする必要のあるファイルが多数ある場合、これはおそらくわずかに最適化された方法でも機能するはずだと思います:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

GNUにfindはそのための-xtypeオプションがあることに注意してください。
ステファンシャゼル

@StéphaneChazelas-astもそうです。しかし、-depthはまったく必要ありませんでした。多くのエラー呼び出しを回避するために、私はそれを一番上に保持しました-沈黙していてもいなくても-他では愚かでした。
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

サブフォルダー自体に触れることなく、サブフォルダー内のすべてを削除します。

最初は、*のサブディレクトリのためであるmyfolder自体(AB、...)。第二は、*内のファイルのためですABなど、

複数のフォルダが内側にある場合はABなどのファーストランは、: rm /var/myfolder/*/*/*その後、実行しますrm /var/myfolder/*/*


0

また、問題のディレクトリツリーの一番上に移動して、次のコマンドを実行できるはずです。

find . -type f -print0 | xargs -0 rm -rf

ディレクトリツリーをそのままにして、すべてのファイルを削除する必要があります。-print0および-0オプションは、スペースを含むファイルまたはディレクトリ名がないと確信している場合は省略できます。

findコマンドは、ファイル(-type f)とリンク(-type l)を区別するため、リンクがあればそのまま残します。ただし、テストされていません。疑わしい場合は、次を実行します。

見つける。-タイプl

前のfindコマンドを実行する前に何かが表示されるかどうかを確認します。


これにrmフラグがどのように-r, -R, --recursive - remove directories and their contents recursively適合するか説明できますか?
スティーブンラウフ

rm -rfを実行していないため、findを実行しています。-fを入力し、その出力をrm -rfにパイプします。したがって、ファイルを削除するだけで、ディレクトリには影響しません。それは何ですか| xargsビットは、左側のコマンドからの出力を取得し、右側のコマンドに送信します。
rjh427

まさに私のポイント。ディレクトリを渡さない場合、ディレクトリでのみ機能するフラグはどのような用途ですか?
スティーブンラウチ

筋肉の記憶のため、そしてそれはまだ動作します。-f "force"オプションで同じ異論を提起することもできますが、同じ答えを提供します。
rjh427

-2

以下のコマンドを使用してください:

sudo rm -rf directory_in_which_you_have_content / *

----------------または--------------------------------- -----------------------

「*」はすべてを表すため、*を使用すると、すべてのコンテンツが削除されます。そのため、次のようなコマンドを使用するか、すべてのコンテンツを削除するディレクトリに移動して、以下のコマンドを使用します。

sudo rm -rf *

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.