디렉토리와 관련된“찾기”출력


34

작업을 find위해 주어진 루트에 모든 파일과 디렉토리를 재귀 적으로 나열하는 데 사용하고 싶습니다 cpio. 그러나 루트 디렉토리 자체가 경로에 표시되는 것을 원하지 않습니다. 예를 들어, 나는 현재 다음을 얻습니다.

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

하지만 받고 싶습니다

file1
dir1
dir1/file2

(루트도 원하는 출력이 아니지만으로 쉽게 제거 할 수 있습니다 tail).

저는 OS X를 사용하고 있으며 가능한 경우 추가 도구 (예 : GNU find)를 설치하지 않으려 고합니다. 다른 OS X 사용자와 작성한 스크립트를 공유하고 싶습니다.

cut루트 목록을 잘라 내기 위해이 작업을 수행 할 수 있다는 것을 알고 있지만 차선책으로 보입니다. 더 나은 솔루션이 있습니까?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

답변:


18

수행하려는 작업이 너무 복잡하지 않은 경우 sed를 사용 하여이 작업을 수행 할 수 있습니다.

find diskimg | sed -n 's|^diskimg/||p'

또는 cut:

find diskimg | cut -sd / -f 2-

명령에 대해 거의 모든 구분 기호를 선택할 수 있으므로 다음 find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'^같이하십시오. , 어떤 CPU를 저장))
올리비에 Dulac

그렙없이 또 다른 방법 : find diskimg | sed -e 's|^diskimg/*||' ((가) '/ *이'도, '/'0의 수와 일치합니다)
올리비에 Dulac

cut명령은 내가 사용한 명령보다 깨끗합니다. 나는 그것을 좋아한다. ( sed솔루션도 훌륭하지만 반복은 diskimg/약간 불행합니다.)
nneonneo

30

cd 먼저 디렉토리에 :

cd diskimg && find . 

완료되면 루트 디렉토리로 돌아갑니다.

이 경우 파일 앞에 ./가 붙습니다. 내가 볼 수있는 유일한 방법은 다음을 사용하는 것입니다 cut.

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

쉘의 현재 디렉토리를 변경하지 않으려면 서브 쉘을 사용하십시오 (파이프의 왼쪽이 이미 서브 쉘에서 실행될 때 출력을 파이핑하는 경우 필요하지 않습니다).

(cd diskimg && find .)

5
완료시 원래 디렉토리로 돌아가려면 : 괄호 추가 : (cd diskimg && find . ; ). 그런 식 cd diskimg && find .으로 서브 쉘에서 수행됩니다. 서브 쉘이 종료되면 디렉토리에 상관없이 자신의 쉘로 돌아갑니다.
Olivier Dulac

1
find *쓸모 접두사 주위에 또 다른 방법입니다
nik.shornikov

23

또 다른 더 복잡하지만 다른 답변의 찾기 접근 방식 만 사용하십시오.

find diskimg -mindepth 1 -printf '%P\n'

모든 버전의 find지원이 아닙니다 printf.
jordanm

1
확실히; 내 OSX는 그렇지 않습니다. 부분적으로 다른 솔루션을 제공 한 이유는 무엇입니까?
Stephan

2
@Stephan-다음에 이러한 유형의 답변을 단일 답변으로 결합 할 수 있습니다. 이와 같은 차이에 대해 여러 번 답변 할 필요가 없습니다.
slm

2
GNU 만 find지원 -printf하고 많은 BSD find는 GNU의 일부 기능을 find복사 -printf했지만 아직 아무 것도 복사 하지 않았습니다 (AFAIK).
Stéphane Chazelas

%P상대 경로에 대한 내가 필요로했던이었다.
Fl0v0

4

realpath유틸리티를 사용하십시오 :

find diskimg -exec realpath --relative-to diskimg {} \;

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