다음과 같이 디렉토리에 있는 일부 파일을 나열(또는 삭제 또는 다른 작업 수행)하고 싶습니다.
$ ls /opt/somedir/
aa bb cc aa.txt bb.txt cc.txt
$ ls /opt/somedir/(aa|bb|cc) ## pseudo-bash :p
aa bb cc
(디렉토리를 먼저 CD로 이동하지 않고) 이를 달성하려면 어떻게 해야 합니까?
답변1
답변2
bash에서 실행 shopt -s extglob
(또는 이것을 당신의 것에 넣으십시오 ~/.bashrc
). 다른 것을 사용할 수 있습니다무늬특이한 구문(ksh에서 상속됨)으로 정규식을 제공합니다. 물론 ksh에서도 이러한 모드를 사용할 수 있고, zsh 이후에도 이러한 모드를 사용할 수 있습니다 setopt ksh_glob
.
$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa /opt/somedir/bb /opt/somedir/cc
zsh에서는 (foo|bar)
패턴으로 직접 사용할 수 있습니다.
% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa /opt/somedir/bb /opt/somedir/cc
명령은 전체 경로로 호출됩니다. 짧은 경로를 사용하여 명령을 호출하려면 디렉토리를 어떻게든 변경해야 합니다. 이것이 (cd /opt/somedir && somecommand aa bb cc)
가장 쉬운 방법입니다.
답변3
다음을 사용하여 필터링할 수 있습니다 egrep
.
ls | egrep '(aa|bb|cc)'
모든 텍스트 파일을 찾으려면:
ls | egrep '(aa|bb|cc).txt'
답변4
먼저 안내해 드리겠습니다.ls를 절대로 구문 분석하지 마세요,한 번. 원하는 작업을 수행하는 정확하고 정식적인 방법은 다음과 같습니다.찾다.
예를 들어:
find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;
나는 일반적 으로 더 간단하기 때문에 -name
대신 사용합니다. -regex
그러나 정규 표현식은 사용 사례에 적합합니다. 명령을 실행해야합니다아니요 -exec
이동/삭제하려는 파일이 맞는지 처음으로 확인하세요.