Exclui recursivamente diretórios vazios com uma exclusão de diretório / dotfile?

1

Como recursivamente excluo todos os diretórios que não contêm arquivos e excluo diretórios ocultos?

Muitos dos diretórios que desejo excluir contêm diretórios ocultos (diretórios de pontos) com arquivos dentro deles, não quero esses diretórios.

No entanto, quaisquer diretórios com arquivos realmente visíveis neles - eu desejo manter.

Alguma sugestão?

Exemplo (desejo excluir)

v@localhost:~/test$ ls -al
total 20
drwxrwxr-x   3 v v  4096 Oct 28 04:31 .
drwxr-xr-x 255 v v 12288 Oct 28 04:38 ..
drwxrwxr-x   4 v v  4096 Oct 28 04:31 .hidden

Exemplo (desejo manter)

v@localhost:~/google.com$ ls -al
total 348
drwxrwxr-x   6 v v   4096 Oct 28 04:39 .
drwxr-xr-x 255 v v  12288 Oct 28 04:38 ..
-rw-rw-r--   1 v v     54 Oct 28 04:39 BCF9360BE20A13B7DA407BF12AF28650.txt
-rw-rw-r--   1 v v    254 Oct 28 04:39 crossdomain.xml
-rw-rw-r--   1 v v   1150 Oct 28 04:39 favicon.ico
-rw-rw-r--   1 v v    234 Oct 28 04:39 .htaccess
-rw-rw-r--   1 v v     23 Oct 28 04:39 index.html
-rw-rw-r--   1 v v    418 Oct 28 04:39 index.php
-rw-rw-r--   1 v v  19935 Oct 28 04:39 license.txt
-rw-rw-r--   1 v v 110249 Oct 28 04:39 php_errors.log
-rw-rw-r--   1 v v   7344 Oct 28 04:39 readme.html
-rw-rw-r--   1 v v   5456 Oct 28 04:39 wp-activate.php
drwxrwxr-x   9 v v   4096 Oct 28 04:39 wp-admin
-rw-rw-r--   1 v v    364 Oct 28 04:39 wp-blog-header.php
-rw-rw-r--   1 v v   1477 Oct 28 04:39 wp-comments-post.php
-rw-rw-r--   1 v v   3376 Oct 28 04:39 wp-config-local.php
-rw-rw-r--   1 v v   5219 Oct 28 04:39 wp-config.php
-rw-rw-r--   1 v v   2853 Oct 28 04:39 wp-config-sample.php
drwxrwxr-x   7 v v   4096 Oct 28 04:39 wp-content
-rw-rw-r--   1 v v   3286 Oct 28 04:39 wp-cron.php
drwxrwxr-x  17 v v  12288 Oct 28 04:39 wp-includes
-rw-rw-r--   1 v v   2382 Oct 28 04:39 wp-links-opml.php
-rw-rw-r--   1 v v   3353 Oct 28 04:39 wp-load.php
-rw-rw-r--   1 v v  34057 Oct 28 04:39 wp-login.php
-rw-rw-r--   1 v v   7993 Oct 28 04:39 wp-mail.php
-rw-rw-r--   1 v v  13920 Oct 28 04:39 wp-settings.php
-rw-rw-r--   1 v v  29890 Oct 28 04:39 wp-signup.php
-rw-rw-r--   1 v v   4035 Oct 28 04:39 wp-trackback.php
-rw-rw-r--   1 v v   3064 Oct 28 04:39 xmlrpc.php
    
por vazovop 28.10.2018 / 04:40

2 respostas

0

rmdir não removerá um diretório não vazio para que você possa fazer:

find . -type d \! -name '.*' -depth -exec rmdir -v --ignore-fail-on-non-empty {} \;

(onde --ignore-fail-on-non-empty é apenas sobre mensagens de erro ...)

    
por 28.10.2018 / 17:23
0

Isso fica um pouco complicado, mas você pode juntar alguns testes find , a saber:

  • inicie no diretório desejado ( /path/to/dir )
  • inicie de baixo para cima ( -depth ), para esvaziar os diretórios de candidatos antes de considerar seus diretórios pai
  • considere apenas diretórios ( -type d )
  • para cada uma das correspondências acima (uma por vez), execute um shell bash que:
    • define que a opção shell nulo garante que a opção de shell dotglob é não definida
    • usa o $1/* shell glob para definir os parâmetros posicionais para o número de arquivos correspondentes (e / ou diretórios) no diretório correspondido - observando que o não intermitente dotglob informa o bash para não count dot -files (ou dot-directories) na expansão, e que a opção nullglob permitirá que o glob se expanda para nothing se não houver nenhuma correspondência.
    • se o número de arquivos / diretórios resultantes for zero, retorne "sucesso"
  • para todos os diretórios que passaram no teste acima, execute rm -r neles, quantos couberem em um comando rm de cada vez ( + ).

Resumindo:

find /path/to/dir -depth -type d \
  -exec bash -c \
     'shopt -s nullglob; shopt -u dotglob; set -- $1/*; test "$#" -eq 0' find-sh {} \; \
  -exec rm -r {} +

Hat-tip para A resposta do Find / exec de Stéphane aqui para fornecer uma boa base para esta resposta começar .

Para criar um banco de testes:

mkdir tmp
cd tmp
mkdir dir{1..3}
touch dir1/.hidden
touch dir2/foo
touch dir3/bar
    
por 28.10.2018 / 16:29

Tags