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 ...)
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
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 ...)
Isso fica um pouco complicado, mas você pode juntar alguns testes find
, a saber:
/path/to/dir
) -depth
), para esvaziar os diretórios de candidatos antes de considerar seus diretórios pai -type d
) $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. 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