次の入れ子になったディレクトリのリストがあるとします。
./x1/mf/dir1
./x1/mf/dir2
./x1/mf/file1
./x2/mf/dir3
./x2/mf/file2
...
mf
各ディレクトリのサブディレクトリをすべて削除したいと思います。dir1
前の例では意味します。dir2
dir3
わかりました
find . -type d -name "mf"
という名前のすべてのディレクトリのリストを返しますmf
。そして、ls -d */
現在のディレクトリの下のすべてのサブディレクトリを返します。だから私は努力しました
find . -type d -name "mf" -exec ls -d /* {} \;
必要なディレクトリを一覧表示しますが、実際には/
結果リストをパイプして後でxargs rm -r
削除しようとしています。
答え1
テストディレクトリとファイルを設定します。
$ mkdir -p x{1..3}/mf/dir{1..3}
$ touch x{1..3}/mf/file{1..3}
$ tree
.
|-- x1
| `-- mf
| |-- dir1
| |-- dir2
| |-- dir3
| |-- file1
| |-- file2
| `-- file3
|-- x2
| `-- mf
| |-- dir1
| |-- dir2
| |-- dir3
| |-- file1
| |-- file2
| `-- file3
`-- x3
`-- mf
|-- dir1
|-- dir2
|-- dir3
|-- file1
|-- file2
`-- file3
次に、そのパスからすべてのディレクトリを見つけてmf
削除します。-depth
深さ優先巡回を実行するため、削除されたfind
ディレクトリに入ろうとする試みは行われません。また、削除されたすべてのディレクトリの名前も印刷します。
$ find . -depth -type d -path "*/mf/*" -print -exec rm -rf {} +
./x1/mf/dir1
./x1/mf/dir2
./x1/mf/dir3
./x2/mf/dir1
./x2/mf/dir2
./x2/mf/dir3
./x3/mf/dir1
./x3/mf/dir2
./x3/mf/dir3
今:
$ tree
.
|-- x1
| `-- mf
| |-- file1
| |-- file2
| `-- file3
|-- x2
| `-- mf
| |-- file1
| |-- file2
| `-- file3
`-- x3
`-- mf
|-- file1
|-- file2
`-- file3
答え2
明らかな理由で、ingのls
前に使用することをお勧めします。rm -fr
find . -type d -name "mf" -print0 | xargs -0 -n1 -I haystack find haystack -type d -exec rm -fr {} \;
例:
$ tree
.
├── bar
│ ├── foo
│ │ ├── bar
│ │ └── baz
│ └── freeble
├── baz
│ ├── foo
│ │ ├── bar
│ │ └── baz
│ └── freeble
└── quux
├── foo
│ ├── bar
│ └── baz
└── freeble
15 directories, 0 files
$ find . -type d -name "foo" -print0 | xargs -0 -n1 -I haystack find haystack -type d -maxdepth 0 -exec rm -fr {} \;
$ tree
.
├── bar
│ └── freeble
├── baz
│ └── freeble
└── quux
└── freeble
6 directories, 0 files