bash를 사용하여 다른 디렉토리에서 특정 파일을 어떻게 선택합니까? 디렉토리의 특정 파일에 대해 다음과

디렉토리의 특정 파일에 대해 다음과 같이 나열하거나 삭제하거나 다른 작업을 수행하고 싶습니다.

$ 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하지 않고)?



답변

중괄호를 사용하십시오.

ls /opt/somedir/{aa,bb,cc}

자세한 정보는 괄호 확장 에 대해 읽으십시오 .


답변

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.