find 명령에서 파일 이름 만 어떻게 반환합니까?


14

터미널에서 find 명령을 실행할 때 파일 경로 목록 (다른 경로없이)을 얻으려고합니다. Mac에서 어떻게이 작업을 수행합니까?

답변:



6

Evilsoup은 게시 된 내용이 파일 이름 간격으로 작동하지 않는다고 언급했습니다. 대신 다음을 사용할 수 있습니다.

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

이것은 이름에 공백이있는 파일을 깰 것입니다 ( greg의 위키에서 ls 구문 분석 참조 )
evilsoup

속도 +1 내가 뭔가 잘못했는지 모르겠지만 $ HOME에서 1 초가 걸렸지 만 다른 모든 사람들은 약 10 초가 걸렸습니다. 물론 이것을 찾아서 입력하려면 10 초 이상이 필요합니다.
Paulo Almeida

2

GNU find를 사용하면 다음을 수행 할 수 있습니다.

 find ~/tmp/ -printf "%f\n"

이것은 아마도 OS X에서도 시도해 볼 가치가 있습니다.


2
-printfOS X의 BSD에서는 지원되지 않습니다 find.
Daniel Beck

1
또한 -printfC printf또는 POSIX 쉘 유틸리티 와 는 거의 관련이 없습니다 printf. 이 역사적인 함수 이름을 다른 것으로 사용하는 것은 매우 좋지 않습니다. 보수적 인 BSD 녀석들도 같은 방식으로 보았을 것이므로 -printf, BSD find에서 그 이름으로 복제본을 보지 못할 것입니다 .
Kaz

다른 컨텍스트에서 유사한 작업을 수행하기 위해 익숙한 함수 이름을 사용하는 것으로 잘못 간주되는 것에 동의하지 않습니다. BSD가 지원하지 않는 이유는 또 다른 문제입니다.
Ярослав Рахматуллин

2

파일 경로의 마지막 부분을 제외한 모든 것을 제거하는 더 좋은 방법이 있습니다. awk. 모든 파일에 대해 awk가 한 번 실행되지 않기 때문에 더 좋습니다. 어떤 경우에는 이것이 중요합니다.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

~ / tmp의 파일 만 찾고 모든 항목이 슬래시로 구분 된 목록을 얻습니다. 따라서 슬래시를 필드 구분 기호 (-F /)로 사용하고 마지막 필드 ($ NF)에 해당하는 필드 매개 변수 ($ 1 .. $ 9)를 인쇄합니다.


이것은 내가 테스트 한 가장 빠릅니다.
Paulo Almeida

나는 최근에 Cygwin을 사용하고 있으며, 윈도우에서 프로세스를 생성하는 것은 매우 비싸다 ...
Ярослав Рахматуллин

2

편집 :

사용 sed:

$ find . -type f | sed 's/.*\///'

@nerdwaller의 응답에서 언급했듯이 xargs 명령 사용

$ find . -type f -print0 | xargs --null -n1 basename

1
하나를 지적 해 주셔서 감사합니다, +1, xargs를 많이 사용하지 않았습니다 ... 내 명령에서 꽤 많은 문자를 삭제했기 때문에 틀림없이해야합니다.
nerdwaller

파일에 공백이 있으면 중단됩니다. 최소한 빠른 테스트에서 다음과 같이 작동합니다.find . -type f -print0| xargs --null -n1 basename
Paulo Almeida

OSX--null-n1
Valeriy Van

1

이건 어때?

find … | egrep -o -e '[^/]+$'

이점 : 각 결과마다 하나씩이 아니라 정확히 하나의 추가 프로세스 만 생성됩니다.


0

sh찾기 -exec옵션 내에서 전화 를 걸 수 있고 불쾌한 파이프를 사용하지 않아도됩니다. 또한 재미있는 파일 이름 (공백, 줄 바꿈 등)에 대해 걱정할 필요가 없다는 이점이 있습니다.

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.