Com o gnu find, qual a diferença entre -print0 e -printf “% p \ 0”?

4

Em um terminal eu posso correr ...

find . -type f -print0
./testdir/testfile2.txt./testdir/testfile.txt

E então ...

find . -type f -printf "%p
2.5.1 :001 > 'find . -type f -print0'
 => "./testdir/testfile2.txt\u0000./testdir/testfile.txt\u0000" 
" ./testdir/testfile2.txt./testdir/testfile.txt

Ambos visualmente aparecem da mesma forma, mas como isso é sobre o caractere nulo, isso não diz muito. Se eu correr através do ruby repl:

2.5.1 :002 > 'find . -type f -printf "%p
find . -type f -print0
./testdir/testfile2.txt./testdir/testfile.txt
"' Traceback (most recent call last): 3: from /usr/share/rvm/rubies/ruby-2.5.1/bin/irb:11:in '<main>' 2: from (irb):2 1: from (irb):2:in ''' ArgumentError (string contains null byte)

e depois

find . -type f -printf "%p
2.5.1 :001 > 'find . -type f -print0'
 => "./testdir/testfile2.txt\u0000./testdir/testfile.txt\u0000" 
" ./testdir/testfile2.txt./testdir/testfile.txt

Qual é a diferença em que a opção -print0 produz vs printf ?

Teste as informações do sistema:

uname: Linux XPS-15-9570 4.15.0-30-generic #32-Ubuntu SMP Thu Jul 26 17:42:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

ruby: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] .

    
por user605331 13.08.2018 / 17:46

1 resposta

10

Não deve haver diferença. Canalize a saída por meio de cat -v , o que escapará de caracteres não imprimíveis.

Talvez você tenha algumas configurações especiais de localidade, o que modifica o que -print0 faz. Pelo menos com minhas configurações en_US.UTF-8 não há diferença. Talvez adicione a saída de locale à sua pergunta.

Possivelmente, seu teste com ruby faz com que ruby interprete o find e %code% nem sequer seja executado.

    
por 13.08.2018 / 18:02

Tags