디렉토리의 특정 파일에 대해 다음과 같이 나열하거나 삭제하거나 다른 작업을 수행하고 싶습니다.
$ 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-ing하지 않고)?
답변
답변
bash에서 실행 shopt -s extglob
하거나 ()에 넣으면 예외적 인 구문 (ksh에서 상 속됨)으로 정규 표현식을 제공 ~/.bashrc
하는 추가 패턴 을 사용할 수 있습니다 . 이러한 패턴을 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)
, 가장 쉬운 방법입니다.
답변
다음을 사용하여 필터링 할 수 있습니다 egrep
.
ls | egrep '(aa|bb|cc)'
모든 텍스트 파일을 찾으려면
ls | egrep '(aa|bb|cc).txt'
답변
첫째, 나는 당신을 직접 결코 구문 분석 LS , 이제까지 . 원하는 것을 수행하는 적절하고 정식적인 방법은 find 입니다.
예를 들면 다음과 같습니다.
find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;
나는 보통 더 간단하기 때문에 -name
대신에 사용 합니다 -regex
. 그러나 정규식은 사용 사례에 적합합니다. 실제로 이동 / 삭제하려는 파일인지 확인하기 위해 처음으로 명령 을 실행해야합니다 -exec
.