".c"로 끝나지 않는 파일을 삭제하는 방법은 무엇입니까?

".c"로 끝나지 않는 파일을 삭제하는 방법은 무엇입니까?

모든 C 프로그램이 포함된 디렉토리가 있습니다. 또한 코드를 확인할 수 있도록 생성 시 컴파일했습니다. 프로그램이 거의 100개에 달합니다. 그래서 파일이 ".c"로 끝나는지 확인하는 BASH 스크립트가 필요합니다. 그렇다면 아무 작업도 수행하지 않고, 그렇지 않으면 삭제합니다. 내 파일 이름 중 하나가 "Hello.c"라고 가정하고 컴파일할 때 바이너리 이름을 "Hello"로 지정합니다. 누군가 나를 위해 이 스크립트를 만들어 줄 수 있나요?

답변1

-delete(첫 번째 테스트) 플래그를 사용할 수 있습니다find-ls

find -not -name "*.c" -delete

을 사용하지 않고 find현재 디렉터리의 파일만 사용하려는 경우 다음을 수행할 수 있습니다.

rm !(*.c)

올바른 와일드카드가 bash설정 되어 있는지 확인하십시오 . shopt -s extglob또한 globstar( )를 설정하면 shopt -s globstar재귀적으로 작업할 수 있습니다( bash버전 4+의 경우).

rm **/!(*.c)

답변2

find나는 항상 이 경우를 선호합니다. 특별한 파일 이름에 대해 걱정할 필요가 없으며 다양한 파일 형식을 처리할 수 있습니다. 파일만 삭제하려면 -type f옵션에 이 항목을 추가해야 합니다. 그래서 제가 가장 좋아하는 솔루션은 다음과 같습니다.

find -not -name "*.c" -type f -delete

그래도 조심하세요. 이와 같은 명령을 테스트하는 것은 항상 좋은 생각입니다.

답변3

ksh 확장 활성화와일드카드 패턴명령을 사용하십시오 shopt -s extglob( 에 넣을 수 있음 ~/.bashrc). 그런 다음 패턴은 !(*.c)일치하는 파일을 제외하고 현재 디렉터리의 모든 파일과 일치합니다 *.c.

rm !(*.c)

.txt이는 파일, .h파일 등을 삭제하므로 매우 위험합니다 . 덜 과감한 명령은 다음과 같습니다.

rm !(*.*) *.o

그래도 등은 삭제됩니다 README. Makefile아마도 실행 파일을 삭제해야 할 것입니다.

find . -type d -prune -o -type f -perm -100 -exec rm {} +

지원하는 경우 더 짧게 find:

find . -maxdepth 1 -type f -perm -100 -delete

관련 정보