/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進数シーケンスと一致します)。x
y
ksh
+([0-9])
(D)
隠しファイル(またはファイル)を含むD
glob修飾子(^-/)
グローバル予選シンボリックリンクの確認後、ディレクトリタイプではないファイルのみ(-
ディレクトリへのシンボリックリンクも削除するには、このエントリを削除します。)
答え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 ディレクトリに切り替えて、そのディレクトリに正常に入ります。
- 呼び出しは
find
1レベルの深さでのみ行われ、そこにあるディレクトリ以外のすべてのエントリを削除します。 - 他のすべてのサブディレクトリ、つまり/ path / to / fooディレクトリ内のサブディレクトリの場合は、名前が "."のエントリを拒否し、1つ以上の数字以外のエントリを含むエントリを選択します。
- 選択されたカタログは屠殺場に渡され、デジタル専用カタログの生存を保証します。
答え4
find ./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete
または、foo
ファイルが多すぎてパラメーター制限を超えた場合は、以下を使用してください。
find . ! -path . ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete