여러 자리 접미사가 있는 비슷한 이름의 파일을 삭제하려면 와일드카드를 사용하세요.

여러 자리 접미사가 있는 비슷한 이름의 파일을 삭제하려면 와일드카드를 사용하세요.

1부터 500까지 비슷한 이름과 접미사를 가진 파일이 많이 있습니다. 1~250개의 파일만 삭제하고 싶습니다. 와일드카드를 사용하여 이를 수행하는 방법이 있습니까?

파일은 다음과 같습니다: stdout.1 ~ stdout.500

stdout.1에서 stdout.250까지 파일을 삭제하고 싶습니다.

감사해요

답변1

Zsh에서는 십진 정수를 나타내는 파일 이름 부분에 rm stdout.<1-250>.match 를 수행할 수 있습니다.<n-m>N도착하다. (앞에 0이 있을 수 있으므로 이것도 stdout.0099일치합니다.)

Bash에서는 중괄호 확장을 사용할 수 있습니다 rm stdout.{1..250}. 하지만 Zsh와의 차이점은 <1-250>중괄호 확장이 기존 파일에 관계없이 문자열을 생성하므로 목록 중간에 파일이 없으면 오류가 발생할 수 있다는 것입니다. 의 경우 rm이 옵션을 추가하면 이러한 오류가 제거됩니다 . 링크 해제를 요청한 파일이 반환 후에도 여전히 존재하는 경우에만 오류가 발생하기 -f때문입니다 .-frm

존재하지 않는 파일에 대한 이름 생성을 피하거나 표준 sh(예: 중괄호 확장 없음)으로 제한하려면 문자별로 일치해야 합니다. 그래서:

rm stdout.? stdout.??       #   1 to  99
rm stdout.1??               # 100 to 199
rm stdout.2[01234]?         # 200 to 249
rm stdout.250               # 250

그러나 일치하는 파일이 없으면 호출된 파일이 존재하면 rm stdout.2[01234]?결국 삭제된다는 점에 유의하세요.stdout.2[1234]?

답변2

당신은 그것을 사용할 수 있습니다버팀대 확장이를 위해

rm stdout.{1..500}

명령은 으로 확장됩니다 rm stdout.1 stdout.2 ... stdout.500. 일부 파일이 없으면 오류 메시지가 표시되지만 무시해도 됩니다. 또는 stderr을 리디렉션하여 표시되지 않도록 할 수 있습니다.

rm stdout.{1..500} 2>/dev/null

또는 훨씬 느려지므로 파일을 반복하여 rm존재하는 파일에서만 실행할 수 있습니다.

for f in stdout.{1..500}; do
    [ -e "$f" ] && rm "$f"
done

stdout.이름이 하나 이상의 숫자로 시작하고 끝나는 모든 파일을 삭제할 수도 있습니다 .

rm stdout.[0-9]*

하지만 이는 유지하려는 패턴과 일치하는 파일이 없는 경우에만 작동합니다.모두파일 표시 이름은 숫자로 시작하고 그 뒤에 숫자가 따르므로 범위에 없는 파일 stdout.도 삭제됩니다 .stdout.501

관련 정보