トップレベルのデジタルディレクトリを除くすべてのアイテムを削除するにはどうすればよいですか?

トップレベルのデジタルディレクトリを除くすべてのアイテムを削除するにはどうすればよいですか?

/path/to/fooメタパターンに一致するサブディレクトリを除いて、ディレクトリの下のすべてのエントリを削除したいと思います。

/path/to/foo/<DIGITS>/

たとえば、次のものが元々次のような/path/to/foo場合:

/path/to/foo
├── 0/
│   ├── a
│   └── b
├── 232532/
├── 42
├── 73/
│   ├── d
│   └── e
├── 8xyz/
│   ├── i
│   └── j
├── _bar/
│   ├── x
│   ├── y
│   └── z
├── .baz/
│   ├── f
│   └── frobozz/
│       ├── g
│       └── h
└── quux/
    └── 123/

...終わりたい

/path/to/foo
├── 0/
│   ├── a
│   └── b
├── 232532/
└── 73/
    ├── d
    └── e

私はこれを行うことができますfind ... -delete- ベースの注文または適切なzshグローバルパターン(について)を探しています。rm -r私はLinuxを使用しています。

答え1

そしてzsh

set -o extendedglob # best in ~/.zshrc
rm -rf /path/to/foo/^<->(D) /path/to/foo/<->(^-/)
  • ^somethingはい何かではない(似kshている!(something)
  • <->はからの<x-y>10進整数と一致しますが、境界を提供しません(したがって 'sに似たすべての10進数シーケンスと一致します)。xyksh+([0-9])
  • (D)隠しファイル(またはファイル)を含むDglob修飾子
  • (^-/)グローバル予選シンボリックリンクの確認後、ディレクトリタイプではないファイルのみ-ディレクトリへのシンボリックリンクも削除するには、このエントリを削除します。)

答え2

GNUにアクセスできる場合は、次をfind実行できます。

find . -maxdepth 1 -not \( -type d -regex '.*/[0-9]*$' \) -exec rm -r {} +

アイデアは、i)ディレクトリではなく、ii)名前が数字のみで構成されるトップレベルファイルを見つけることです。

何が起こるのかを見るechoよりも一度実行してみることをお勧めします。rm -r

答え3

cd /path/to/foo && \
find . -maxdepth 1 ! -type d -delete -o \
   ! -name . -name '*[!0-9]*' -exec rm -rf {} +

内容は次のとおりです。

  • /path/to/foo ディレクトリに切り替えて、そのディレクトリに正常に入ります。
  • 呼び出しはfind1レベルの深さでのみ行われ、そこにあるディレクトリ以外のすべてのエントリを削除します。
  • 他のすべてのサブディレクトリ、つまり/ path / to / fooディレクトリ内のサブディレクトリの場合は、名前が "."のエントリを拒否し、1つ以上の数字以外のエントリを含むエントリを選択します。
  • 選択されたカタログは屠殺場に渡され、デジタル専用カタログの生存を保証します。

答え4

find ./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete

または、fooファイルが多すぎてパラメーター制限を超えた場合は、以下を使用してください。

find . ! -path . ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete

関連情報