17

ディレクトリ内のすべてのファイルを削除できるかどうかを知りたいrmのですが (ただし、サブフォルダーまたはサブフォルダー内のファイルは削除できません)?

私は何人かの人々が使用していることを知っています:

rm -f /direcname/*.*

ただし、これは、ファイル名にすべての拡張子があるとは限らない拡張子があることを前提としています(拡張子の有無にかかわらず、すべてのファイルを削除したい)。

4

8 に答える 8

35

find を使用するとファイルを削除できますが、-exec rm {} \;使用できます

find /direcname -maxdepth 1 -type f -delete

そしてそれはより速いです。-delete を使用すると、ディレクトリの内容をディレクトリの前に処理することを意味する -depth オプションを意味します。

于 2012-05-05T08:51:49.610 に答える
7
find /direcname -maxdepth 1 -type f -exec rm {} \;

説明:

  • find内のファイルとディレクトリを検索します/direcname
  • -maxdepthの直接の子であるファイルとディレクトリを検索するように制限します/direcname
  • -type f検索をファイルに制限します
  • -exec rm {} \;各ファイルに対してコマンドrm {}を実行します (の代わりにファイルのパスを置き換えた後{})。
于 2012-05-05T08:45:27.150 に答える
2

シェル ソリューション (非標準の find -maxdepth なし) は次のようになります。

for file in .* *; do
   test -f "$file" && rm "$file"
done
于 2012-05-05T08:50:37.150 に答える
2

使用できます

find /direcname -maxdepth 1 -type f -exec rm -f {} \;
于 2012-05-05T08:44:04.700 に答える
1

Unix は DOS ではありません。ファイル名に特別な「拡張子」フィールドはありません。ドットの後の文字はすべて名前の一部であり、サフィックスと呼ばれます。のように、複数のサフィックスが存在する場合があります.tar.gz。シェル グロブ文字*は文字全体で一致し.ます。接尾辞を無視します。したがって、MS-DOS*.**Unix だけです。

ほとんど。*で始まるファイルには一致しません.。先頭にドットが付いた名前のオブジェクトは、慣例により「非表示」です。ls指定しない限り、どちらにも表示されません-a

(これは、「self」および「parent」のディレクトリ エントリが非表示と見なされることを意味します。.)..

非表示のエントリも照合するには、次を使用します.*

このrmコマンドはディレクトリを削除しません ( で再帰的に操作しない場合-r)。試してみrm <directory>てください。ディレクトリが空であっても拒否します。

したがって、すべての (非表示でない) ファイル、パイプ、デバイス、ソケット、およびシンボリック リンクをディレクトリから削除する (ただし、サブディレクトリはそのままにしておく) 方法は、実際には次のとおりです。

rm /path/to/directory/*

で始まる非表示のものも削除するには.

rm /path/to/directory/{*,.*}

この構文はブレース展開です。ブレース展開はパターン マッチングではありません。これは、複数の引数を生成するための省略形にすぎません。この場合は次のようになります。

rm /path/to/directory/* /path/to/directory/.*

この展開が最初に行われ、次に削除される名前を生成するためにグロビングが行われます。

ここに投稿されたさまざまなソリューションには、さまざまな問題があることに注意してください。

find /path/to/directory -type f -delete

# -delete is not Unix standard; GNU find extension
# without -maxdepth 1 this will recurse over all files
# -maxdepth is also a GNU extension
# -type f finds only files; so this neglects to delete symlinks, fifos, etc.

GNU find ソリューションには、削除するディレクトリ エントリの数が膨大な場合でも機能するという利点があります。1 回の呼び出しで渡すには大きすぎますrm。もう 1 つの利点は、ビルトインでは、-delete変なパス名を外部コマンドに渡す際の問題がないことです。

ディレクトリ エントリが多すぎる問題の移植可能な回避策は、次のようにエントリを一覧表示し、次のlsようにパイプすることxargsです。

( cd /path/to/directory ; ls -a | xargs rm -- )

括弧は、「これらのコマンドをサブプロセスで実行する」ことを意味します。このようにして、 の効果cdが忘れられます。これは、スクリプト作成に役立ちます。ls -a隠しファイルが含まれています。

「これが最後のオプションであり、それ以外はすべて非オプションの引数です」という意味の--afterが含まれるようになりました。rmこれにより、名前がオプションと区別できないディレクトリエントリから保護されます。ファイルが呼び出さ-rfれ、最初の引数で終わる場合はどうなるでしょうか? 次に、 rm -rf ...サブディレクトリを吹き飛ばすものがあります。

于 2012-05-05T19:42:04.057 に答える
1

一部のシェル、特にzshやおそらく bash バージョン 4 (バージョン 3 ではない) には、それを行うための構文があります。

zsh を使用すると、次のように入力できます

rm /dir/path/*(.)

名前が foo で始まるファイルをサブディレクトリで再帰的に削除する場合は、次のようにします。

rm /dir/path/**/foo*(.)

私の意見では、ダブルスター機能は(インタラクティブな補完が優れているため)、インタラクティブなシェル用にzshに切り替えるのに十分です。YMMV

括弧内のサフィックスのドットは、ファイルのみ (シンボリック リンクやディレクトリではなく) を zsh シェルで展開することを示します。

于 2012-05-05T10:00:15.030 に答える
1

これを行う最も簡単な方法は、次を使用することです。

rm *

ディレクトリを削除するには、オプション -r を指定する必要があります

rm -r

したがって、ディレクトリとそこに含まれるものは、使用しても削除されません

rm *

rm のマニュアルページによると、その目的はファイルを削除することであり、これが機能する理由です

于 2016-06-03T14:42:35.483 に答える