find 명령을 사용하여 패턴과 일치하는 파일을 삭제하는 방법은 무엇입니까?


17

특정 패턴과 일치하는 모든 파일을 삭제하는 bash 명령을 작성하려고합니다.이 경우 빌드 된 모든 오래된 vmware 로그 파일입니다.

이 명령을 시도했습니다.

find . -name vmware-*.log | xargs rm

그러나 명령을 실행하면 이름에 공백이있는 모든 폴더에서 질식합니다. xargs가 rm 따옴표로 묶거나 올바르게 이스케이프하도록 파일 경로를 형식화하는 방법이 있습니까?


답변:


20

나는 일반적으로 -exec옵션을 사용하는 find것이 더 쉽고 혼란스럽지 않다는 것을 알았습니다 . 이 시도:

find . -name vmware-*.log -exec rm -i {} \;

이후의 모든 것은 -exec각 결과에 대해 실행하는 명령으로 간주되며 ;,이 (가)이 (가)로 전달됩니다 find. 은 {}파일 이름으로 대체됩니다 find일반적으로 인쇄하는 것입니다.

확인한 후 원하는 작업을 수행하면를 제거 할 수 있습니다 -i.


1
또한 디렉토리가 아닌 삭제하려는 파일 인 경우 find 명령에 ''-type f ''를 추가 할 수 있습니다.
JamesHannah

18

GNU가 있다면 다음 옵션을 find사용할 수 있습니다 -delete.

find . -name "vmware-*.log" -delete

xargs파일 이름에 공백이있는 문제 를 사용 하고 피 하려면 :

find . -name vmware-*.log -print0 | xargs -0 rm

그러나 로그 파일 이름에는 공백이 없어야합니다. 워드 프로세싱 문서와 MP3 파일에는 파일이있을 수 있지만 로그 파일의 이름을 제어 할 수 있어야합니다.


그거 멋지다. 나는 그것에 대해 몰랐다.
Jeff Snider

8

당신은 말할 수 findnull로 출력 목록을 구분하고, xargs같은 입력 목록을받을 수 :

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

또한 *백 슬래시를 사용하거나 vmware-*.log작은 따옴표 를 포함하여을 이스케이프 처리해야 합니다. 그렇지 않으면 셸이로 전달하기 전에 확장하려고 시도 할 수 있습니다 find.


6

찾기 -delete옵션을 잊지 마십시오 . 특수 문자로 오류없이 파일을 제거합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.