이름에 문자열이 없는 파일 삭제

이름에 문자열이 없는 파일 삭제

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 {} +실제로 제거합니다.

관련 정보