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/echo
echo 실행 파일의 인스턴스는 발견된 각 파일에 대해 실행됩니다 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
. 이는 단지 예일 뿐입니다. 실제로는 찾은 파일을 대신 실행하고 싶을 수도 있습니다.-exec
echo
my-command
echo
비효율적이지만 효과적인 솔루션은 다음과 같습니다.
find . -type f -exec sh -c 'echo ${0#./}' "{}" \;
설명하다:
sh -c 'echo $0' foobar
우리는 인쇄 서브쉘이 실행$0
되고 다음foobar
과 같이$0
전달된다는 사실에 의존합니다.foobar
- 대신에
$0
우리는 실제로 를 사용하는데${0#./}
, 이는 "사용$0
하되 앞의./
(#./
)를 제거함을 의미합니다.매개변수 확장 - exec( 슬래시가 붙은
{}
파일 이름)에서 다음으로 전달합니다 .find
$0
sh -c
그래서 결국 my-command
달려야 해선행 없이 파일을 찾았습니다../
, 당신은 할 것입니다 :
find . -type f -exec sh -c 'my-command ${0#./}' "{}" \;