具体来说,在 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
当 GNUfind
没有给出起始点时(如问题中给出的命令),它将使用当前目录 ( .
) 作为起始点。因此,在这种情况下,该格式将从找到的路径中%P
删除。./
-printf '%P\0'
要执行与非 GNU实现相同的操作find
,假设-mindepth
仍然可用(如在find
BSD 系统上):
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'
删除文件名前面的%P
首字母。./
您可以使用 执行等效操作sed 's|^\./||'
。该\0
部分在每个文件名之间生成一个空字符而不是换行符。您可以使用 将换行符转换为 null tr '\n' '\0'
。所以你可以尝试
find . -mindepth 1 -print | sed 's|^\./||' | tr '\n' '\0'
如果任何名称包含换行符,这将损坏它们,将该换行符转换为 null 并将文件路径转换./foo<newline>./bar
为foo<null>bar
.