Belirli bir dizindeki tüm dosyaları tarih sırasına göre nasıl birleştirebilirim, en yeni dosyanın üstte olmasını istiyorum?


18

En alttaki en eski dosya ile mi?

Ayrıca, bunu yaparsam, her HTML dosyasında bulunan gereksiz başlıkları çıkarmak da mümkün mü? Kendimi HTML dosyaları bir sürü birleştirmek görüyorum ve nihai dosyanın dosya boyutunu biraz azaltmak güzel olurdu.

Yanıtlar:


33

Kullandığınız dosyaları birleştirmek için

cat file1 file2 file3 ...

Alıntılanan dosya adlarının zamana göre sıralanmış bir listesini almak için, önce en yenisi,

ls -t

Hepsini bir araya koy,

cat $(ls -t) > outputfile

ls(Örneğin, *.html) için bazı argümanlar vermek isteyebilirsiniz .

Ancak, içinde boşluk olan dosya adlarınız varsa, bu işe yaramaz. My file.htmliki dosya adı olarak kabul edilecektir: Myve file.html. lsDosya adlarını alıntı yapabilir ve daha sonra, alıntıyı xargsanlayan, bağımsız değişkenleri iletmek için kullanabilirsiniz cat.

ls -tQ | xargs cat

İkinci sorunuza gelince, dosyaların parçalarını filtrelemek zor değildir, ancak tam olarak neyi çıkarmak istediğinize bağlıdır. “Yedek başlıklar” nelerdir?


Bu benim debian sistemim üzerinde çalışmıyor ... Kullanmak zorundayım cat $(ls -t) > outputfile, aksi takdirde catalıntı yapılan dosya adlarını reddediyor
Mike Pennington

1
Benim hatam. Bu tür şeylere hep yakalanırım. Güncellenmiş cevaba bakınız.
angus

Ah - gereksiz başlıklar ile normalde bazı header.php / footer.php dosyasına konulan, ancak HTML'ye kaydedildiğinde ayrı olarak kaydedilen (ve PHP sayfalarını toplu olarak indirdiğinizde dosya boyutunu gerçekten artırabilen) şeyleri kastediyorum.
InquilineKea

cat $(ls -t)dosya adının genişletilmesine de açıktır. *, Veya ?, veya köşeli ayraç ifadesi olan bir dosya adı varsa (örneğin file-[old].html); ve kalıp olarak yorumlanan dosya adının diğer dosya adlarıyla eşleşip eşleşmediği; yaklaşım yanlış bir liste oluşturacaktır. set -fbu eksikliği giderir.
Barefoot IO

ls -Qiçin uygun olmayan çıktılar üretebilir xargs. Örneğin, "foo"olur "\"foo\"", ancak xargs çift tırnaklı dizelerde kaçan çift tırnak işaretlerini anlamıyor.
Barefoot IO

2

Sözcük bilgisi dışındaki bir sırayla dosyaları listelemenin en kolay yolu zsh glob niteleyicileridir . Zsh olmadan kullanabilirsiniz ls, ancak çıktısını ayrıştırmak lstehlikelerle doludur .

cat *(om)

Bazı çizgileri çıkarmak istiyorsanız, sed veya awk veya perl kullanın. Örneğin , ve etiketlerinin her dosyadaki bir satırda yalnız olduğunu varsayarak <head>, ilk dosyadan almak ve <body>diğer dosyalardan parçaları birleştirmek için :<body></body>

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

Açıklama:

  • İlk concatenated.htmlolarak oluşturulur. Bu nedenle en genç *.htmldosyadır (hiçbir dosyanın gelecekte bir tarihi olmadığı varsayılarak).
  • Sonra en küçük ikinci *.htmldosyadan kopyalayın , ancak </body>satırdan çıkın .
  • Ardından diğer dosyalardan kopyalayın, ancak her şeyi <body>satıra atlayın ve satırdan </body>başlayın.
  • Son olarak son kapanış etiketlerini üretin.

1

@Angus tarafından verilen çözüm iyidir, ancak klasörde dizinler varsa bu sorunu çözecektir.

cat $(ls -tpa | grep -v / )


Uyarı: Bu cevap, angus'un cevabına yaptığım yorumda açıklandığı gibi yol adı genişlemesine de açıktır.
Barefoot IO

Kedinin çıkış durumu test edilmedikçe, bir dizin argümanı önemsiz olmalıdır. kedi stderr'e bir mesaj gönderecek ve bir sonraki tartışmaya geçecektir.
Barefoot IO
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.