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.
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:
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.html
iki dosya adı olarak kabul edilecektir: My
ve file.html
. ls
Dosya adlarını alıntı yapabilir ve daha sonra, alıntıyı xargs
anlayan, 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?
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 -f
bu eksikliği giderir.
ls -Q
iç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.
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 ls
tehlikelerle 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:
concatenated.html
olarak oluşturulur. Bu nedenle en genç *.html
dosyadır (hiçbir dosyanın gelecekte bir tarihi olmadığı varsayılarak).*.html
dosyadan kopyalayın , ancak </body>
satırdan çıkın .<body>
satıra atlayın ve satırdan </body>
başlayın.@Angus tarafından verilen çözüm iyidir, ancak klasörde dizinler varsa bu sorunu çözecektir.
cat $(ls -tpa | grep -v / )
cat $(ls -t) > outputfile
, aksi takdirdecat
alıntı yapılan dosya adlarını reddediyor