特に、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
。