999
이름에 해당 문자열이 없는 파일을 삭제하고 싶습니다.
나는 시도했다:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
그러나 그들 중 누구도 작동하지 않습니다. 저는 bash:3.2.57과 함께 macOS Sierra를 사용하고 있습니다.
답변1
다음에서 확장된 globbing 패턴을 사용하십시오 bash
.
rm ./!(*999*)
이 기능을 활성화해야 합니다 (그리고 shopt -s extglob
모든 파일 이름이 포함된 경우 shopt -s failglob
특이한 이름을 가진 파일이 실수로 삭제되지 않도록 안전해야 합니다). 이 패턴은 일치하는 이름을 제외한 현재 디렉터리의 모든 이름과 일치합니다.!(*999*)
999
!(*999*)
*999*
또한 숨겨진 파일(이름이 다음으로 시작함)을 삭제합니다.가리키다), 이 dotglob
옵션을 활성화합니다 shopt -s dotglob
.
일반 파일이나 일반 파일에 대한 심볼릭 링크(디렉토리 등은 제외)에만 관심이 있습니다.
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
위 루프에 해당하는 쉘은 zsh
다음과 같습니다.
rm ./(^(*999*))(.)
grep
첫 번째 명령은 파일 내부를 보기 때문에 작동하지 않습니다 . 줄 없이 모든 파일을 삭제합니다 ( 999
해당 옵션을 추가하면 --null
작동합니다 xargs -0
).
grep
두 번째 명령은 macOS에서 지원되지 않으므로 작동하지 않습니다 --null-data
(단, 옵션이 있지만 --null
파일 이름 출력을 생성하는 경우에만 해당). 또한 999
파일의 어느 곳에서나 볼 수 있습니다.경로명(즉, 파일 이름뿐만 아니라 모든 디렉터리 구성 요소 포함)
답변2
이름 조건을 반대로 바꾸십시오 find
.
find . -type f \! -name "*999*"
일치하는 파일을 추가 -delete
하거나 -exec rm {} +
실제로 제거합니다.