하위 디렉토리로 재귀 적으로 파일을 검색하는 방법


117

XML특정 디렉토리의 모든 파일과 그 안의 모든 하위 디렉토리를 (재귀 적으로) 찾으려고 합니다.

ls -R *.xml현재 디렉토리의 파일 만 나열합니다. 하위 폴더 자체에는 여러 .xml파일이 있지만 아무것도 표시되지 않습니다.

이것이 구성 문제입니까?


2
당신은 할 수 있습니다ls -R | grep .xml
Nikos

답변:


90

찾기를 사용해 보십시오

sudo find . -print | grep -i '.*[.]xml'

4
sudo가 있어야합니까, 아니면 슈퍼 사용자 권한을 보장해야합니까?
Shamim Hafiz 2016 년

4
나는 당신이 결정하게했습니다. Sudo , No Sudo .
Mitch

6
그냥 관심 없어 findover 의 장점은 무엇입니까 ls -R?
don.joey

1
@이 도움이 될 수 don.joey stackoverflow.com/questions/13830036/...
미치

10
-1과 믹싱을 위해 , 정규식과 glob를 모두 사용하여 필터링을 할 수 find있고 믹싱 해야 grep할 때 ' 와 grep을 find사용하지 않는 경우. find-print0-z
muru

147

찾기 만으로 할 수 있습니다 .

find . -name '*.xml'

.현재 디렉토리입니다. 다른 디렉토리에서 검색해야하는 경우 .디렉토리 경로로 바꾸십시오 .


2
현재 디렉토리를 기반으로하는 디렉토리에서 필요한 파일을 재귀 적으로 검색합니다. 내 경우에는 방금 현재 디렉토리에서만 체크인했지만 하위 디렉토리는 확인하지 않았습니다.
Mostafiz Rahman

1
@mostafiz, 당신은 '* .xml'부분을 인용해야합니다. 답변을 편집하겠습니다.
KaeruCT

1
실제로 .php현재 디렉토리에서 파일을 검색했습니다 . 그러나 .php현재 디렉토리의 파일 만 반환 했으며 하위 디렉토리에서는 재귀 적으로 검색하지 않았습니다. 그래서 find명령 검색을 재귀 적으로 검색 할지 묻습니다 .
Mostafiz Rahman 16

3
@mostafiz, find명령은 재귀 적으로 검색합니다. 매개 변수를 인용하지 않으면 셸에서 확장을 수행 할 수 *있으므로 현재 디렉토리의 파일과 일치합니다.
KaeruCT

괜찮아! 내가 실수했을 수도 있습니다. 이제는 완벽하게 작동합니다!
Mostafiz Rahman

13

이 명령을 시도하십시오 :

ls -R | grep '.*[.]xml'

ls출력을 필터링하는 옵션이 없습니다. 이를 위해서는 파이프를 사용해야합니다. 출력을에서 lsgrep전달한 다음 .xml파일 만 표시하도록 필터링합니다 .


5
어쨌든 이것이 그것이 온 디렉토리를 보여주기 위해 얻었습니까?
AdamO


4

세게 때리다

사용 globstar쉘 옵션을, 우리는 재귀 대체 (globbing)를 사용할 수있다./**/*

bash-4.3$ shopt -s globstar
bash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

Perl에는 Find재귀 디렉토리 트리 탐색을 허용 하는 모듈 이 있습니다. 특수 find()함수 내에서 원하는 서브 루틴과 트래버스하려는 디렉토리를 정의 할 수 있습니다 (이 예에서는) .. 이 경우 하나의 라이너는 다음과 같습니다.

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

파이썬

Perl에는 재귀 트리 탐색 전용 모듈이 있지만 Python에는 모듈의 walk()일부인 깔끔한 함수 가 있으며 os최상위 경로의 튜플, 모든 하위 디렉토리 목록 및 파일 이름 목록을 반복적으로 반환합니다. 우리는 다음을 할 수 있습니다 :

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

이것은 스크립트만큼 훨씬 깔끔 할 수 있습니다.

#!/usr/bin/env python
import os,sys 
for r,s,f in os.walk("."): 
    for i in f: 
        if i.endswith(".xml") 
             print(os.path.join(r,i))

검색

find재귀 순회에 대한 다른 답변이 언급 되었으며, 이것이 작업을위한 도구입니다. 필요한 것은 출력을 원하는 형식으로 인쇄하고, 일반 파일 만 찾고, inode 번호 로 검색하고, 수정 날짜로 검색하고 , 파일을 처리하기 위해 특정 명령을 실행하는 find등의 여러 명령 행 스위치가 있다는 사실입니다. 파일을 인수 ( 현재 파일의 표준 자리 표시 자)로 전달하고 다른 많은 사람들은에 대한 맨 페이지를 읽으십시오 .-printf-type f-inum-mtime-exec <command> {} \;{}findfind

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.