도트 파일/디렉터리 제외를 사용하여 빈 디렉터리를 반복적으로 삭제하시겠습니까?

도트 파일/디렉터리 제외를 사용하여 빈 디렉터리를 반복적으로 삭제하시겠습니까?

파일이 포함되지 않은 모든 디렉터리를 재귀적으로 삭제하고 숨겨진 디렉터리를 제외하는 방법은 무엇입니까?

제거하려는 디렉토리 중 다수에는 원하지 않는 파일이 포함된 숨겨진 디렉토리(점 디렉토리)가 포함되어 있습니다.

그러나 실제로 표시되는 파일이 포함된 모든 디렉터리는 유지하고 싶습니다.

어떤 제안이 있으십니까?

예시(삭제하고 싶어요)

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

예(계속하고 싶습니다)

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

답변1

rmdir비어 있지 않은 디렉터리는 삭제되지 않으므로 다음을 수행할 수 있습니다.

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

( --ignore-fail-on-non-empty오류 메시지는 어디에 있습니까 ...)

답변2

약간 복잡해 지지만 find다음과 같은 몇 가지 테스트를 함께 연결할 수 있습니다.

  • 원하는 디렉터리( /path/to/dir) 에서 시작합니다.
  • -depth상위 디렉토리를 고려하기 전에 후보 디렉토리가 비워지도록 아래에서 위로( ) 시작합니다.
  • 디렉토리만 고려( -type d)
  • 위의 각 일치 항목에 대해(한 번에 하나씩) bash 셸을 실행합니다.
    • 세트nullglob 쉘 옵션 dotglob 쉘 옵션이 다음과 같은지 확인하십시오.설정되지 않음
    • 쉘 glob을 사용하여 $1/*위치 인수를 일치하는 디렉터리의 일치하는 파일(및/또는 디렉터리) 수로 설정합니다. dotglob을 설정하지 않으면 bash에 알립니다.아니요확장에서 도트 파일(또는 도트 디렉토리)을 평가하고 nullglob 옵션을 사용하면 glob이 다음으로 확장됩니다.아무것도 없다전혀 일치하지 않는 경우.
    • 결과 파일/디렉토리 수가 0이면 "성공"을 반환합니다.
  • 위 테스트를 통과한 디렉터리에 대해 명령이 실행되면 rm -r들어갈 디렉터리 수 ( ).rm+

합산:

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 {} +

쪽으로Stéphane의 찾기/실행 답변은 여기에 있습니다.이 답변에 대한 좋은 출발점을 제공합니다.

테스트벤치를 생성합니다:

mkdir tmp
cd tmp
mkdir dir{1..3}
touch dir1/.hidden
touch dir2/foo
touch dir3/bar

관련 정보