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
때문입니다 .-f
rm
존재하지 않는 파일에 대한 이름 생성을 피하거나 표준 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