주어진 디렉토리에서만 파일을 찾고 bash를 사용하여 하위 디렉토리를 무시하는 방법


129

다른 유사한 질문을 보았지만 제한된 시간을 기준으로 개념을 파악하고 상황에 적용 할 수있는 질문을 찾지 못했습니다. 특정 파일을 찾기 위해 find 명령을 실행하고 있지만 하위 디렉토리의 일부 파일은 무시하려는 동일한 이름을 갖습니다. 도움을 주셔서 감사합니다. 아래는 내가 사용하는 명령입니다.

내가 관심있는 파일 / 패턴 : / dev / abc-scanner, / dev / abc-cash ....

명령 :

find /dev/ -name 'abc-*'

반환되는 것 :

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

후자의 파일을 무시하고 싶습니다 : /dev/.udev / ...


9
특정 하위 디렉토리를 무시하거나 하위 디렉토리로 내려 가지 않습니까? 후자의 경우 -maxdepth 1 옵션
frankc

@frankc 답변으로 게시하십시오.
cnicutar

답변:


202

찾기를 첫 번째 레벨로 제한하려면 다음을 수행하십시오.

 find /dev -maxdepth 1 -name 'abc-*'

... 또는 특히 .udev디렉토리 를 제외하려면 다음을 수행하십시오.

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

위의 모든 심볼릭 링크가 위의 패턴에서 찾은 위치를 나열하려면 파이프를 사용합니까? find / dev -maxdepth 1 -name 'abc- *'와 같은 것 | ls -l
suffa

1
xargs대신 에 사용 하는 것이 더 좋습니다 . find /dev -maxdepth 1 -name 'abc-*' | xargs ls -l그러나 이름에 공백이있을 가능성이있는 경우 다음을 수행해야합니다.find /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

그러나 Stephen Darlington의 답변 에서 알 수 있듯이 , 왜 그렇게하지 ls -l /dev/abc-*
않을지 모르겠습니다

또한 심볼릭 링크가 가리키는 위치를 찾으려면 다음을 수행하십시오.for x in /dev/abc-*; do readlink -f $x; done
Mark Longair

1
또는 첫 번째 수준에서만 하위 디렉토리를 원한다면 ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... 내 리눅스를 제외하고 /dev/*/*는 파일이 포함되어 있지 않으므로 /dev/.udev/*를 생략 할 수 있습니다 fgrep -v.
tripleee

9

사용해야 할 특별한 이유가 find있습니까? ls디렉토리의 패턴과 일치하는 파일을 찾기 위해 사용할 수 있습니다 .

ls /dev/abc-*

를 사용해야 find하는 경우 -maxdepth 1스위치를 사용 하여 지정된 디렉토리에만 적용 할 수 있습니다 .


난 당신 말은 생각 -maxdepth 1보다는-maxdepth 0
마크 Longair

5
여기서 와일드 카드는 중요한 부분이 아니라는 점을 지적해야합니다 ls. 쉘이 와일드 카드를 확장하므로 동일한 파일 echo이나 다른 파일을 찾을 수 있습니다 wc. 그래서 for file in /dev/abc-*; do something with each "$file"; done영업 이익이 실제로 무엇을 찾고 수 있습니다.
tripleee

1
아, 어느 방향인지 기억이 안 나네요 ... 편집 해 주셔서 감사합니다. 또한 보편적이지 않다는 점에 주목할 가치가 있습니다. find예를 들어 Solaris 버전 에는 없습니다.
Stephen Darlington

@tripleee +1. 예. 가능하다면 쉘에서 모두하는 것이 바람직하다.
Stephen Darlington

1
@MustafaOzturk 그것은 ls불필요합니다. for f in abc*; ...당신이 필요한 전부입니다.
Stephen Darlington

4

이것은 당신이 원하는 것을 할 수 있습니다 :

find /dev \( ! -name /dev -prune \) -type f -print

2
그렇습니다. -maxdepth는 일부 구형 유닉스에서 찾기에서 구현되지 않습니다.
CCTO

-1
find /dev -maxdepth 1 -name 'abc-*'

나를 위해 작동하지 않습니다. 아무것도 반환하지 않습니다. 내가 그냥 '.' 그것은 내가 작업하고있는 디렉토리 아래의 디렉토리에있는 모든 파일을 제공합니다.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

'.'로 아무것도 반환하지 마십시오. 대신 내 디렉토리에있는 모든 '큰'파일 목록과 오래된 파일을 저장하는 rootfiles / 디렉토리를 얻습니다.

계속. 작동합니다.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

분명히 관심있는 /dev 디렉토리의미 합니다. 그러나 ./단지 필요한 것이 아닙니다 .. /내가 무엇을 /dev의미 하는지 알아 낸 후에도에 대한 필요성 은 분명하지 않았습니다 .

'평판'이 없기 때문에 의견으로 답변 할 수 없습니다.


1
좋은 대답을함으로써 명성을 얻습니다. 이 stackoverflow.com/conduct
aifrim을

댓글을 작성할 수없는 이유가 있으며 여기에 답변 섹션에 댓글을 달 수있는 권한이 없습니다. 이것을 삭제하십시오.
Rob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.