findを使用してディレクトリを見つけ、そのサブディレクトリを削除します。

findを使用してディレクトリを見つけ、そのサブディレクトリを削除します。

次の入れ子になったディレクトリのリストがあるとします。

./x1/mf/dir1
./x1/mf/dir2
./x1/mf/file1
./x2/mf/dir3
./x2/mf/file2
...

mf各ディレクトリのサブディレクトリをすべて削除したいと思います。dir1前の例では意味します。dir2dir3

わかりました

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

おすすめ記事