콘텐츠를 넣기 전에 출력 디렉터리를 정리하고 있습니다. .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
하지만 무시해도 안전합니다.