나는 그것에 익숙하지 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
.)