`find -delete`는 모든 것을 삭제합니다

`find -delete`는 모든 것을 삭제합니다

나는 그것에 익숙하지 find않고 실수로 많은 파일을 삭제했습니다. 경험이 많은 사람이 내가 잘못 가고 있는 부분을 설명할 수 있는지 궁금합니다.


MacBook의 Finder가 내 Raspbian Samba 공유에 내놓은 모든 파일을 정리하고 싶습니다 .DS_Store.._.DS_Store

  • 내 라즈베리 파이에 하드 드라이브가 연결되어 있고 홈 폴더에 마운트 지점에 대한 심볼릭 링크가 있으므로 -L.
  • 일부 폴더는 시스템 사용자(예: apache)가 소유하므로 sudo.

find대상 파일이 올바른지 확인하기 위해 다음 명령을 실행했습니다 .

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -name \*DS_Store\*
./.DS_Store
./Downloads/USBHDD1/._.DS_Store
./Downloads/USBHDD1/.DS_Store
./Downloads/USBHDD1/backups/ALAC/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/USBHDD1/backups/ALAC/.DS_Store
./Downloads/USBHDD1/backups/._.DS_Store
./Downloads/USBHDD1/backups/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/._.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/FLAC/.DS_Store
./Downloads/USBHDD1/backups/Storage/._.DS_Store
./Downloads/USBHDD1/backups/Storage/.DS_Store
./Downloads/OriginalMusic/._.DS_Store
./Downloads/OriginalMusic/.DS_Store
./Downloads/OriginalMusic/FLAC/.DS_Store
./Downloads/ALAC/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/ALAC/.DS_Store

모든 것이 좋아 보인다!

그런 다음 찾은 파일을 삭제 -delete하는 플래그를 추가했습니다 .find

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -delete -name \*DS_Store\*
find: cannot delete `./Documents': Not a directory
find: cannot delete `./Pictures': Not a directory
find: cannot delete `./Music': Not a directory

나는 그것이 어떤 이유에서든 내 심볼릭 링크를 삭제하려고 한다는 것을 깨달았을 때 그것을 쳤고 Ctrl+C약 절반의 데이터를 저장했습니다 .

문서, 사진, 음악이 모두 사라졌습니다. 아마도 거의 모든 것을 저장한 거대한 다운로드 폴더를 통해 실행되고 있을 것입니다.


find이 파일들을 모두 삭제하나요? 제가 -delete엉뚱한 곳에 넣은 걸까요 ?

답변1

find귀하의 답변은 맨페이지 에 있습니다 .

제거 옵션은 이름 필터보다 먼저 처리됩니다.

       -delete
          Delete files; true if removal succeeded.  If the removal failed,
          an  error message is issued.  If -delete fails, find's exit sta‐
          tus will be nonzero (when it eventually exits).  Use of  -delete
          automatically turns on the -depth option.

          Warnings:  Don't  forget that the find command line is evaluated
          as an expression, so putting -delete first will make find try to
          delete everything below the starting points you specified.  When
          testing a find command line that you later intend  to  use  with
          -delete,  you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete  implies  -depth,  you  cannot
          usefully use -prune and -delete together.

삭제 옵션을 명령의 마지막으로 이동할 수 있습니다.

또는 다음과 같은 것을 사용할 수 있습니다.

find /path -name "*pattern*" | xargs rm -f

또는

find /path -name "*pattern*" -exec rm -f {} \;

답변2

명령줄의 기본 원칙 find은 "조건과 조건이 일치하면...그런 다음 조치를 취하십시오"입니다. 작업은 마지막에 있습니다. 이는 "작업 개체 개체..." 명령을 호출하는 형식과 상당히 다릅니다.

예를 들어, find . -name \*DS_Store\* -delete" *DS_Store*이름이 일치하면 삭제"를 의미합니다. 조건과 액션을 반대로 하면 -delete액션 뒤에 오는 조건이 없으므로 무조건 적용됩니다.

find . -delete -name \*DS_Store\*문법적 오류가 아닌 이유는 행위도 조건이기 때문이다. 작업이 성공하면 -delete조건은 true 이고 실패하면(예: 권한 부족으로 인해) false입니다. 예를 들어, find . -name somethingorother -delete -print성공적으로 삭제된 파일의 이름을 인쇄합니다.

구문 오류가 아닌 이유 find -name \*DS_Store\*는 작업이 없으면 암시적인 -print작업이 있기 때문입니다. 이 디자인의 이유는 인쇄가 매우 일반적인 작업 선택이기 때문입니다.

find(내 답변에는 완전한 거짓말이 포함되어 있지 않지만 상황이 약간 단순화되었습니다. 내 답변의 설명에서 다루지 않은 일부 기능, 특히 !및 논리 연산자가 있습니다 -o.)

관련 정보