find 명령에서 결과 앞에 ./가 붙지 않도록 하려면 어떻게 해야 합니까?

find 명령에서 결과 앞에 ./가 붙지 않도록 하려면 어떻게 해야 합니까?

저는 쉘 스크립팅의 초보자입니다.

아래 명령을 실행하면 다음과 같이 출력됩니다.

$ cd demo
$ ls
dir1 dir2 dir3 dir4 dir5
$
$find . -mtime -2 -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4|dir5)/.+" -exec ls {} \; > /tmp/basefileslist
./dir1/demo1.sh
./dir2/demo2.sh
./dir3/demo3.sh
./dir4/demo4.sh
./dir5/demo5.sh

아니요를 받아야 할까요 ./? 아래와 같은 출력을 원합니다.

dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh

답변1

in find의 출력은 옵션 앞의 인수 ./에서 나옵니다 . 매개변수를 .변경하면 .초점을 맞춘 출력 부분이 변경됩니다. 귀하의 예를 고려하면 요청한 출력이 생성됩니다.

find dir1 dir2 dir3 dir4 dir5 -mtime -2 -type f -exec ls {} \;

정규식 옵션은 하위 디렉터리 매개변수를 지정하는 작업과 중복되는 것으로 추측되므로 제외했습니다. 출력은 다음과 같습니다

dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh

특정 테스트 사례(일치하는 하위 디렉터리가 5개만 있음)에서는 하위 디렉터리 목록을 간단한 쉘 glob으로 줄일 수 있습니다.

find dir[1-5] -mtime -2 -type f -exec ls {} \;

또는 더 짧은 구체:

find dir? -mtime -2 -type f -exec ls {} \;

많은 사용 사례에서 이러한 필수 파일이 사용 find dir1 dir2 dir3 dir4 dir5되거나 발견되지 않습니다. find dir?그러나 내 대답의 목적은 옵션 앞의 매개변수가 찾기 출력의 경로에 어떻게 영향을 미치는지 보여주는 것입니다.

답변2

find출력에서 접두사를 제거 하는 대신 GNU 특정(그러나 GNU 특정) 조건자를 사용하도록 명령을 수정할 수 있습니다 . 다음은 원하는 출력을 제공하는 명령의 예입니다../-regextype-printf-exec

find . -mtime -2 \
       -type f \
       -regextype posix-egrep \
       -regex '.*/(dir1|dir2|dir3|dir4|dir5)/.+' \
       -printf '%P\n' > /tmp/basefileslist

이 명령에서 조건자는 선행 접두사 없이 -printf '%P\n'발견된 각 파일의 상대 경로를 인쇄하는 데 사용됩니다 . 형식 지정자는 상대 경로(시작하도록 지정한 디렉터리에 상대적 )를 지정하고 각 경로가 새 줄에 인쇄되어야 함을 지정합니다.find./%P.\n

이 명령을 실행한 후 출력은 다음과 유사해야 합니다.

dir1/demo1.sh
dir2/demo2.sh
dir3/demo3.sh
dir4/demo4.sh
dir5/demo5.sh

관련 정보