숨겨진 파일을 제외한 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

숨겨진 파일을 제외한 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

콘텐츠를 넣기 전에 출력 디렉터리를 정리하고 있습니다. .gitkeep파일을 사용하여 git의 출력 디렉터리를 추적 하고 싶지만 rm -rf "$OUT_DIR"bash 스크립트에 있는 줄로 인해 파일이 계속 삭제됩니다.

디렉토리의 내용을 삭제하고 숨겨진 파일을 유지하거나 해당 파일을 유지하는 방법이 있습니까 .gitkeep?

답변1

기본적으로 bash파일은 전체적으로 점으로 표시되지 않으므로 숨겨진 파일을 제외한 모든 항목을 삭제하려면 bash다음을 사용하십시오 rm.

rm *

예제 출력:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1
-rw-rw-r--  1 user user    0 giu 11 20:00 2
-rw-rw-r--  1 user user    0 giu 11 20:00 3
-rw-rw-r--  1 user user    0 giu 11 20:00 4
-rw-rw-r--  1 user user    0 giu 11 20:00 5
~/test$ rm *
~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1

.gitkeep을 제외한 모든 항목을 제거하려면 bash도트 파일 글로빙을 활성화하고 다음을 사용합니다 rm.

shopt -s dotglob
rm !(.gitkeep)

예제 출력:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:19 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 1
-rw-rw-r--  1 user user    0 giu 11 20:19 2
-rw-rw-r--  1 user user    0 giu 11 20:19 3
-rw-rw-r--  1 user user    0 giu 11 20:19 4
-rw-rw-r--  1 user user    0 giu 11 20:19 5
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep
-rw-rw-r--  1 user user    0 giu 11 20:19 .hidden
~/tmp$ shopt -s dotglob
~/tmp$ rm !(.gitkeep)
rm: cannot remove ‘.’: Is a directory
rm: cannot remove ‘..’: Is a directory
user@user-X550CL:~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:20 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep

답변2

문제는 숨겨진 파일의 경우 재귀 삭제가 rm -r *비재귀 삭제와 다르게 동작한다는 것입니다. rm *첫 번째는 이를 삭제하지만 두 번째는 삭제하지 않습니다(기본 쉘 옵션 사용). 그러나 물론 하위 디렉터리를 삭제하려면 재귀가 필요합니다.

내 해결책은 이동을 사용하여 숨겨진 파일을 삭제하는 대신 보관하는 것이었습니다. 아직 몇 줄이 남아 있지만, 해 보면 의미가 있습니다(기억해야 할 이상한 옵션은 없습니다).

mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme

답변3

이 시도:

shopt -u dotglob        # disable globbing for dot files
ls *

모든 것이 정상이면 ls으로 교체하십시오 rm.

답변4

rm *디렉터리에 하위 디렉터리가 없으면 이 방법은 잘 작동합니다(참조:@kos의 답변). 그러나 모든 하위 디렉터리도 삭제하는 재귀적 솔루션이 필요한 경우(예: @meesern지적했다) rm -r *는 당신이 원하는 것이 아니기 때문에하다숨겨진 파일과 하위 디렉터리를 삭제합니다.

find대신 를 사용하여 숨겨지지 않은 파일과 하위 디렉터리를 나열하고 삭제할 수 있습니다 (다음에서 수정됨).이 답변):

find YOUR_DIRECTORY -not -path '*/\.*' -delete

숨기지 않은 YOUR_DIRECTORY파일을 삭제한 후 비어 있는 모든 하위 디렉터리와 숨겨진 파일이 아닌 모든 파일이 삭제됩니다.

그럴 것이다아니요숨겨진 디렉터리(예 YOUR_DIRECTORY/.foo/bar/baz: )의 콘텐츠를 삭제합니다. 따라서 다음과 같은 경고를 받을 수 있습니다.

find: cannot delete 'some/directory/here': Directory not empty

하지만 무시해도 안전합니다.

관련 정보