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


9

이름에 문자열 '999'가없는 파일 (``없이)을 제거하고 싶습니다.

나는 시도했다 :

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

그러나 그들 중 누구도 작동하지 않습니다. bash와 함께 macOS Sierra를 사용하고 있습니다 : 3.2.57.


2
grep -l파일 이름이 아닌 컨텐츠-v 에서 일치하는 파일을 찾거나 찾을 수없는 파일을 나열합니다 . 항상 지정한 파일의 내용과 일치하며 이름은 절대 일치하지 않습니다. grep
JoL

답변:


18

확장 된 글 로빙 패턴을 사용 bash:

rm ./!(*999*)

shopt -s extglob기능을 사용하도록 설정 해야 합니다 (그리고 안전을 위해 모든 파일 이름에가 포함 된 경우 shopt -s failglob이상한 이름을 가진 파일이 !(*999*)실수로 제거 되지 않도록 999). 패턴 !(*999*)은 일치하는 이름을 제외하고 현재 디렉토리의 모든 이름과 일치 *999*합니다. 숨겨진 파일 (이름이 점으로 시작하는 파일)을 제거하려면 이 dotglob옵션 도 활성화하십시오 .

일반 파일 또는 일반 파일 (디렉토리 등이 아님)에 대한 심볼릭 링크 만 신경 쓰려면 :

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zsh상기 루프 쉘 동등한 것

rm ./(^(*999*))(.)

grep파일 내부를 살펴볼 것이기 때문에 첫 번째 명령이 작동하지 않습니다 . 줄이없는 모든 파일을 제거 999합니다 ( --null옵션 을 추가 했으므로 작동합니다 xargs -0).

grepmacOS에서는 두 번째 명령이 작동 하지 않습니다 --null-data(그러나 --null파일 이름 출력을 생성 할 때만 옵션 이 있습니다 ). 또한 찾을 것입니다 점에 유의 999파일의 어디서나 경로 (디렉토리 구성 요소를 포함)뿐만 아니라 파일의 이름입니다.


1
failglob옵션 을 활성화 하거나 !(*999*)이름에 포함되지 않은 다른 파일이없는 경우 호출 된 파일을 제거 할 수도 있습니다 999.
Stéphane Chazelas

16

다음에서 이름 조건을 반전하십시오 find.

find . -type f \! -name "*999*" 

일치하는 파일을 추가 -delete하거나 -exec rm {} +실제로 제거하십시오.


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