다른 찾기 구현의 GNU find -printf 플래그와 동일합니다.

다른 찾기 구현의 GNU find -printf 플래그와 동일합니다.

특히, mkinitcpio에서 이 명령을 사용하는 것은 find -mindepth 1 -printf '%P\0'-printf 플래그를 사용하지 않고 동일한 출력으로 명령을 다시 만드는 방법입니다.https://git.archlinux.org/mkinitcpio.git/tree/mkinitcpio유용할 경우를 대비해 전체 스크립트는 다음과 같습니다.

답변1

%P시작점으로 사용된 디렉터리에서 시작하는 파일에 대한 상대 경로를 제공하므로 find시작점으로 실행하고 경로 이름을 찾으면 .some/pathsome/path/to/file%Pto/file

GNU에 find시작점이 주어지지 않으면(질문에 제공된 명령과 같이) 현재 디렉터리( .)를 시작점으로 사용합니다. 따라서 이 경우 %P검색된 경로에서 형식이 제거됩니다../

-printf '%P\0'GNU가 아닌 구현과 동일한 작업을 수행하려면 ( BSD 시스템 과 같이) 여전히 사용 가능하다고 find가정합니다 .-mindepthfind

find . -mindepth 1 -exec sh -c '
    for pathname do
        printf "%s\0" "${pathname#./}"
    done' sh {} +

포함된 sh -c스크립트는 처리할 경로 이름 배치를 가져오고 find표준 인수 확장을 사용하여 ./종료 널 문자로 인쇄하기 전에 경로 이름의 첫 번째 문자를 제거합니다.


똑같지만 변수를 보유하는 경우하나의최상위 디렉터리 경로:

topdir=/some/path

find "$topdir" -mindepth 1 -exec sh -c '
    topdir=${1%/}; shift
    for pathname do
        printf "%s\0" "${pathname#$topdir/}"
    done' sh "$topdir" {} +

답변2

파일 이름 앞의 첫 문자를 -printf '%P\0'제거 하면 됩니다 . 를 사용하여 동등한 작업을 수행할 수 있습니다 . 이 부분은 각 파일 이름 사이에 개행 문자 대신 널 문자를 생성합니다. 를 사용하여 개행 문자를 null로 변환할 수 있습니다 . 그래서 당신은 시도해 볼 수 있습니다%P./sed 's|^\./||'\0tr '\n' '\0'

find . -mindepth 1 -print | sed 's|^\./||' | tr '\n' '\0'

개행 문자가 포함된 이름은 모두 손상되어 해당 개행 문자를 null로 변환하고 파일 경로 ./foo<newline>./barfoo<null>bar.

관련 정보