특히, mkinitcpio에서 이 명령을 사용하는 것은 find -mindepth 1 -printf '%P\0'
-printf 플래그를 사용하지 않고 동일한 출력으로 명령을 다시 만드는 방법입니다.https://git.archlinux.org/mkinitcpio.git/tree/mkinitcpio유용할 경우를 대비해 전체 스크립트는 다음과 같습니다.
답변1
%P
시작점으로 사용된 디렉터리에서 시작하는 파일에 대한 상대 경로를 제공하므로 find
시작점으로 실행하고 경로 이름을 찾으면 .some/path
some/path/to/file
%P
to/file
GNU에 find
시작점이 주어지지 않으면(질문에 제공된 명령과 같이) 현재 디렉터리( .
)를 시작점으로 사용합니다. 따라서 이 경우 %P
검색된 경로에서 형식이 제거됩니다../
-printf '%P\0'
GNU가 아닌 구현과 동일한 작업을 수행하려면 ( BSD 시스템 과 같이) 여전히 사용 가능하다고 find
가정합니다 .-mindepth
find
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|^\./||'
\0
tr '\n' '\0'
find . -mindepth 1 -print | sed 's|^\./||' | tr '\n' '\0'
개행 문자가 포함된 이름은 모두 손상되어 해당 개행 문자를 null로 변환하고 파일 경로 ./foo<newline>./bar
를 foo<null>bar
.