Bash'da boş sınırlandırılmış girişte `head` ve` tail` nasıl yapılır?


18

findkomutu, dosya adlarını boş olarak ayrılmış dizeler olarak ( -print0sağlanmışsa) çıktı xargsverebilir ve -0seçenek açıkken bunları kullanabilir . - Ama aradaki bu dosyaların bu koleksiyonu işlemek zor sortkomut vardır -zama, anahtarı, mümkün bu dosyaları sıralamak için yapar headve tailbunları yok.

Boş sınırlandırılmış girişleri nasıl headve tailuygun bir şekilde yapabilirim? (Her zaman kısa ve yavaş bir yakut senaryosu oluşturabilirim, ancak umarım daha iyi bir yol olabilir)

Yanıtlar:


21

GNU headve tailcoreutils sürüm 8.25'ten beri -zbunun için bir seçenek var.

Eski sürümleri ile veya GNU dışı sistemler için, denemek ve takas edebilir \0ve \n:

find ... -print0 |
  tr '\0\n' '\n\0' |
  head |
  tr '\0\n' '\n\0'

Bazı geldiğini hatırlatırız headuygulamaları boş karakterlerden ile baş edemez (ve POSIX tarafından çıkarmanız gerektiğini), ama nereye destekleri bulmak -print0, headve metin araçları ile genellikle boş karakteri destekler.

İki trs arasındaki herhangi bir komutu sarmak için bir işlev de kullanabilirsiniz :

nul_terminated() {
  tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}

find ... -print0 | nul_terminated tail -n 12 | xargs -r0 ...

Onun altında Unutmayın nul_terminatedbir, \0aracı bir satır karakteri. Yani örneğin, yerine \nile _:

find . -depth -name $'*\n*' -print0 | nul_terminated sed '
  p;h;s,.*/,,;s/\x0/_/g;H;g;s,[^/]*\n,,' | xargs -r0n2 mv

( \x0aynı zamanda bir GNU uzantısıdır).

Birden fazla filtreleme komutu çalıştırmanız gerekiyorsa şunları yapabilirsiniz:

find ... -print0 |
  nul_terminated cmd1 |
  nul_terminated cmd2 | xargs -r0 ...

Ancak bu, birkaç gereksiz trkomut çalıştırmak demektir . Alternatif olarak, şunları da çalıştırabilirsiniz:

find ... -print0 | nul_terminated eval 'cmd1 | cmd2' | xargs -r0 ...

2
Bu , değerleri sınırlamak \x0yerine kullanımın birincil nedenini bozmaz \nmı? (¹ içerebilecek değerlerle başa çıkabilirsiniz \n)
Thedward

@ Bundan sonra, hayır, tam tersine -print0 | tr '\n\0' '\0\n', içinde yeni satır karakterlerinin dönüştürüldüğü dosya yollarını temsil eden satırlar vardır \0. Dolayısıyla, ilk satırı alırsanız head -n 1ve \0s'yi tekrar yeni satırlara dönüştürürseniz, tr '\0\n' '\n\0'gömülü yeni satır karakterleriyle NUL ile ayrılmış ilk dosya yoluna sahip olursunuz.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.