기본 파일 이름이 동일한 파일이 여러 개 있습니다. 하나만 빼고 모두 삭제하고 싶어요
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
하나를 보관할 필요가 없으면 를 사용할 수 있다는 것을 알고 있습니다 rm foo.*
.
TLDP부정 일치를 보여줍니다 ^
. 시행착오를 거쳐서 알아낸 것은
rm foo.*[^org]
필요한 작업을 수행하지만 구문을 잘 이해하지 못합니다.
또한 이것이 내 사용 사례의 제한은 아니지만 이 패턴은 foo.o
및 foo.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