전역 일치에서 패턴 제외

전역 일치에서 패턴 제외

기본 파일 이름이 동일한 파일이 여러 개 있습니다. 하나만 빼고 모두 삭제하고 싶어요

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

하나를 보관할 필요가 없으면 를 사용할 수 있다는 것을 알고 있습니다 rm foo.*.

TLDP부정 일치를 보여줍니다 ^. 시행착오를 거쳐서 알아낸 것은

rm foo.*[^org]

필요한 작업을 수행하지만 구문을 잘 이해하지 못합니다.

또한 이것이 내 사용 사례의 제한은 아니지만 이 패턴은 foo.ofoo.or. 이 모드의 작동 방식 및 무시된 glob에 발생하는 현상오직 foo.org같아?

답변1

shopt -s extglob
echo rm foo.!(org)

이는 foo.NOT 다음에 오는 모든 항목 과 일치합니다.org

이후에 정상적인 글로벌 동작을 복원하려면 다음을 사용하십시오.

shopt -u extglob

인용하다:GNU Bash 참조 매뉴얼

답변2

Bash에서는 GLOBIGNORE="*.org"; rm -i foo*.

unset GLOBIGNORE마친 후.

에 비해 좋지는 않지만 shopt -s extglob기억하기가 더 쉽습니다.

답변3

파이프는 무엇을 할 수 있나요?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(분명히 마지막 체인에서 echo를 rm으로 바꾸고 싶을 수도 있습니다).

답변4

또 다른 방법입니다. foo.sh작업에서 제외하고 싶은 파일이 일부 있지만 csv다른 파일은 모두 추가하고 싶다고 가정해 보겠습니다. 다음 루프를 사용할 수 있습니다.

for f in *; do
  if [ "${f: -3}" != ".sh" ]; then
    mv "$f" "${f%}.csv"
  fi
done

관련 정보