相当于其他 find 实现中的 GNU find -printf 标志

相当于其他 find 实现中的 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

当 GNUfind没有给出起始点时(如问题中给出的命令),它将使用当前目录 ( .) 作为起始点。因此,在这种情况下,该格式将从找到的路径中%P删除。./

-printf '%P\0'要执行与非 GNU实现相同的操作find,假设-mindepth仍然可用(如在findBSD 系统上):

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>./barfoo<null>bar​​.

相关内容