Usando find para procurar um diretório e remover seus subdiretórios

0

Digamos que eu tenha uma lista de diretórios aninhados assim:

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

Eu quero remover todos os subdiretórios de cada diretório mf . Significado dir1 , dir2 , dir3 no exemplo anterior.

Eu sei que

find . -type d -name "mf"

retornará uma lista de todos os diretórios chamados mf . E ls -d */ retorna todos os subdiretórios no diretório atual. Então eu tentei

find . -type d -name "mf" -exec ls -d /* {} \;

para listar os diretórios desejados, mas ele realmente imprime os diretórios dentro de / . Eu estava planejando canalizar a lista resultante para xargs rm -r para fazer a remoção depois.

    
por diaa 16.05.2017 / 17:46

2 respostas

2

Configurando diretórios e arquivos de teste:

$ 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

Em seguida, localize todos os diretórios que possuem mf em seu caminho e exclua-os. O -depth faz uma travessia em profundidade, de modo que find não tente inserir diretórios que já foram excluídos. Também imprimimos os nomes de todos os diretórios que são excluídos.

$ 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

Agora:

$ tree
.
|-- x1
|   '-- mf
|       |-- file1
|       |-- file2
|       '-- file3
|-- x2
|   '-- mf
|       |-- file1
|       |-- file2
|       '-- file3
'-- x3
    '-- mf
        |-- file1
        |-- file2
        '-- file3
    
por 16.05.2017 / 18:16
0

Sugiro strongmente que use isso para ls antes de rm -fr ing por motivos óbvios:

find . -type d -name "mf" -print0 | xargs -0 -n1 -I haystack find haystack -type d -exec rm -fr {} \;

Exemplo:

$ 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
    
por 16.05.2017 / 18:03