여러 폴더 이름으로 파일 찾기


44

나는 모든 파일의 목록에 노력하고 dir1, dir2, dir3dir4어떤 내이의 하위 디렉토리로 어디에서나있을 수 있습니다 cwd사용하여 find명령을. 나는 성공하지 않고 다음을 시도했다.

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

나는 또한 시도 posix-extended했다. 이 파일들을 어떻게 나열합니까?


검색 . -type f -regextype sed -regex ". * / dir [1-4] / [a-z0-9] *".. 지금까지 가장 짧은 답변 :) 아래 답변을 참조하십시오. unix.stackexchange.com/a/390333 / 242983
alpha_989

답변:


59

그리고 세 폴더 이름을 검색 할 경우 foo, barbaz모든 *.py파일이 명령을 사용합니다 :

find foo bar baz -name "*.py"

따라서 사용하지 않는 파일을 표시 dir1 dir2 dir3하려면find dir1 dir2 dir3 -type f

이 시도 find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;


나는 분명히 했어야했다. 검색하려는 파일의 경로가 없을 수 있습니다. 나는 그들이 현재 디렉토리의 하위 디렉토리라는 것을 알고 있습니다.
Aaron

./dirdir
harish.venkat

디렉토리는 여전히 cwd에 있어야하지만 두 레벨이 낮을 수 있습니다 (예 :). ./path/to/dir1이 경우 ./dir1존재하지 않습니다.
Aaron

답변을 편집했습니다.
harish.venkat

8

-path 지시문을 사용하는 것이 가장 좋습니다.

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

즉, 경로에 'dir1'또는 'dir2'또는 'dir3'또는 'dir4'가있는 현재 디렉토리 아래의 모든 파일을 찾으십시오.


괄호가 잘못된 곳에 있습니다. 참조 -a-oGNU의 표준 상응 위해 -and/ -or.
Stéphane Chazelas

4

모두에게 알리기 위해. 전체 경로에 대해 일치하기 때문에 .*/각각을 추가 하기 전에 dir문제를 해결 regex했습니다.


3

이것은 이전 답변을 읽은 후의 첫 번째 아이디어입니다.

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

이것은 정규 표현식이 전체 파일 이름과 일치해야하고 이해하기 쉽다는 것을 고려합니다.


2

와일드 카드 (홈 디렉토리) 및 일반 apache2 로그 디렉토리로 정의 된 여러 위치에서 특정 파일 (access_log)을 찾는 fast (!) 샘플은 이름 필터링을 적용하여 SSL 로그 및 gzipped 이전 로그를 제외합니다. 여기서 질문에 직접 대답하지는 않지만 이러한 지침을 찾은 사용자에게는 유용 할 수 있습니다 (나 같은).

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

특히 근처에 공백에주의 \(하고 \).

그건 그렇고, 나는 서버에서 가장 활동적인 웹 사이트를 찾기 위해 apachetop에 사용했습니다.

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)

2

regextype을 사용하는 경우 이름으로 dir1을 dir4로 지정할 필요가 없습니다.

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: 디렉토리가 아닌 파일 찾기
  • regextype sed: sed regextype을 사용합니다
  • regex: 전체 경로에서 정규식을 사용하여 검색
  • ".*/dir[1-4]/[a-z0-9]*":. *는 처음에 (char / number / backslash (/) 등) 유형일 수있는 문자 수를 의미합니다. dir [1-4]는 "dir"다음에 1과 4 사이의 숫자를 찾는 것을 의미합니다. / [^ /] *는 dir1-4 다음에 /가있는 경로 이름을 생략하므로 dir1-dir4 디렉토리의 파일 만 반환하고 dir1-dir4에있을 수있는 하위 디렉토리는 무시합니다.

https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017 테스트 할 디렉토리를 만들었습니다.


(1) 우리는 아론의 정확한 상황이나 요구 사항을 결코 알지 못할 수도 있지만, 다른 대답은 이름이 지정되지 않은 네 개의 디렉토리를 가지고 있다는 신중한 결정을 내 렸습니다. (그들은 수 red, green, blueyellow, 또는 그들은 수 John, Paul, GeorgeRingo.) 당신의 대답은 있다고 가정 문자 그대로 dir1 , dir2, dir3dir4. … (계속)
Scott

(계속) ... (2) 왜 Aaron이 서브 디렉토리를 검색하고 싶지 않다고 가정합니까? 그는 자신이 그렇게 말하는 것 같습니다. (3) 왜 이름이 파일에 대한 검색을 제한하고 있습니다 만 포함 - 소문자 문자와 숫자 (같은 것들을 제외하고 foo_bar, foo.txtFOO)? (4) /[^/]*대답에서 사용하지 않을 때 왜 텍스트가 설명 됩니까?
Scott

스캇 안녕하세요.
alpha_989

(1-3). 그는 "나는 cdir 의 하위 디렉토리에 있을 수있는 dir1, dir2, dir3 및 dir4의 모든 파일나열 하려고합니다."라는 말은 dir1-dir4가 어디에 있더라도 파일을 찾고 싶습니다. dir1-dir4 내에 있습니다. 물론, dir1-dir4가 아닌 경우 red \ | blue \ | green \ |를 사용하여 특정 이름으로 변경해야합니다. 등
alpha_989

4. 오타가 .. 전에 [a-z0-9] *를 사용했습니다. 그런 다음 [^ /] *가 더 짧고 포괄적이라는 것을 깨달았습니다. 신중한 의견에 감사드립니다.
alpha_989

0

find를 사용하도록 지정했지만 사용할 수있는 다른 옵션을 표시하기 만하면 xargs를 사용할 수 있습니다.

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

다음과 같은 것을 포함하는 "폴더"라는 파일을 가질 수 있습니다.

$ cat folders
dir1
dir2
dir3
dir4

그런 다음 다음과 같이 할 수 있습니다.

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

내 의견으로는 xargs, find -exec보다 다재다능하다고 느낍니다. 또한 당신은 같은 미친 물건을 만들 수 있습니다

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

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