파일이 포함되지 않은 모든 디렉터리를 재귀적으로 삭제하고 숨겨진 디렉터리를 제외하는 방법은 무엇입니까?
제거하려는 디렉토리 중 다수에는 원하지 않는 파일이 포함된 숨겨진 디렉토리(점 디렉토리)가 포함되어 있습니다.
그러나 실제로 표시되는 파일이 포함된 모든 디렉터리는 유지하고 싶습니다.
어떤 제안이 있으십니까?
예시(삭제하고 싶어요)
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