-exec echo {} 옵션과 함께 사용할 때 find 명령 출력에서 ​​선행 점 제거

-exec echo {} 옵션과 함께 사용할 때 find 명령 출력에서 ​​선행 점 제거
find . -type f -exec  echo {} \;

위 명령을 사용하여 선행 "./" 문자 없이 파일 이름을 얻고 싶습니다. 기본적으로 다음을 얻고 싶습니다.

filename

바꾸다:

./filename

이를 수행할 수 있는 방법이 있습니까?

답변1

*대신 사용 .하면 줄 간격이 ./사라집니다.

find * -type f

셸은 먼저 이를 *현재 작업 디렉터리에 있는 숨겨지지 않은(기본) 파일의 정렬된 목록으로 확장하고 이를 .에 전달합니다 find. 이는 다음과 같은 몇 가지 중요한 의미를 갖습니다.

  • 숨겨진 파일은 최상위 수준에서는 생략되지만 더 깊은 수준에서는(탐색된 파일에 의해 ) find생략됩니다 .
  • 목록은 최상위 수준(일반적으로 더하기 기호)으로 정렬됩니다.
  • 현재 작업 디렉터리에 파일이 많으면 명령에 전달할 수 있는 인수 수에 제한이 있을 수 있습니다.
  • !이 방법은 이름이 이라는 파일이 있거나 이름이 로 시작하는 경우 작동하지 않으며 이름이 이라는 파일이 있는 경우 심각한 결과를 초래할 수 있습니다 (.)--delete

답변2

별도의 파일 이름을 원하지 않고 선행 없이 전체 상대 경로를 원한다고 가정하면 ./GNU가 있는 경우 다음을 find사용할 수 있습니다.

find . -type f -printf '%P\n'

find(1) 매뉴얼 페이지에서:

%P- 파일명과 해당 파일이 발견된 원본 이름이 삭제되었습니다.

그렇지 않으면 다음 중 하나를 시도해 볼 수 있습니다.

find . -type f -print | cut -d/ -f2-

find .[!.]* * -type f -print

마지막 항목은 피해야 합니다(디렉토리에 항목이 많으면 명령줄이 너무 길어지는 것을 고려하십시오).

-print기능은 동일 -exec echo {} \;하지만 더 좋습니다. 외부 프로세스 호출이 없으므로 오버헤드가 낮고 대시로 시작하는 파일 이름으로 인한 바람직하지 않은 부작용이 없습니다.

답변3

find . -type f -exec echo {} \;

기본 작업은 find결과를 인쇄하는 것입니다. 명시적으로 지정하지 않으면 find기본적으로 현재 디렉터리를 검색합니다. 명령을 로 단순화할 수 있습니다 find -type f.

이것이 왜/언제 중요합니까? 충분히 큰 디렉터리에서 이 명령을 실행할 때만 성능 차이가 나타나기 시작합니다. 파일 이름 인쇄 -exec echo {} \;와 같은 외부 프로세스를 시작해야 하기 때문에 컴퓨터가 더 불필요하게 작동하게 됩니다 . /bin/echoecho 실행 파일의 인스턴스는 발견된 각 파일에 대해 실행됩니다 find.

삭제에 대한 질문에 답하려면 ./를 사용하는 것이 더 효율적입니다 cut. 처음 두 문자는 항상 입니다 ./. cut -c3-위치 3 이상의 문자만 유지됩니다.

> cd /etc/fonts/conf.d
> find -type f | cut -c3-
99pdftoopvp.conf
00kde.conf
65-khmer.conf
README

파일 이름에 개행 문자가 포함되어 있으면 예상대로 작동하지 않지만 이는 완전히 다른 이야기입니다.

답변4

인수를 통해 명령을 실행하려는 경우에 대한 대답에는 요점이 없습니다 printf. 이는 단지 예일 뿐입니다. 실제로는 찾은 파일을 대신 실행하고 싶을 수도 있습니다.-execechomy-commandecho

비효율적이지만 효과적인 솔루션은 다음과 같습니다.

find . -type f -exec sh -c 'echo ${0#./}' "{}" \;

설명하다:

  • sh -c 'echo $0' foobar우리는 인쇄 서브쉘이 실행 $0되고 다음 foobar과 같이 $0전달된다는 사실에 의존합니다.foobar
  • 대신에 $0우리는 실제로 를 사용하는데 ${0#./}, 이는 "사용 $0하되 앞의 ./( #./)를 제거함을 의미합니다.매개변수 확장
  • exec( 슬래시가 붙은 {}파일 이름)에서 다음으로 전달합니다 .find$0sh -c

그래서 결국 my-command달려야 해선행 없이 파일을 찾았습니다../, 당신은 할 것입니다 :

find . -type f -exec sh -c 'my-command ${0#./}' "{}" \;

관련 정보