E con il file più vecchio in fondo?
Inoltre, se lo faccio, è anche possibile eliminare le intestazioni ridondanti contenute in ciascun file HTML? Mi vedo concatenare molti file HTML e sarebbe bello ridurre un po 'le dimensioni del file finale.
E con il file più vecchio in fondo?
Inoltre, se lo faccio, è anche possibile eliminare le intestazioni ridondanti contenute in ciascun file HTML? Mi vedo concatenare molti file HTML e sarebbe bello ridurre un po 'le dimensioni del file finale.
Risposte:
Per concatenare i file utilizzati
cat file1 file2 file3 ...
Per ottenere un elenco di nomi di file citati ordinati per ora, il più recente per primo, si utilizza
ls -t
Mettere tutto insieme,
cat $(ls -t) > outputfile
Potresti voler dare alcuni argomenti a ls
(ad es *.html
.).
Ma se hai nomi di file con spazi, questo non funzionerà. My file.html
si presume che siano due nomi di file: My
e file.html
. Puoi fare una ls
citazione dei nomi dei file e quindi usare xargs
, chi comprende la citazione, a cui passare gli argomenti cat
.
ls -tQ | xargs cat
Per quanto riguarda la tua seconda domanda, filtrare parti di file non è difficile, ma dipende da cosa esattamente vuoi eliminare. Quali sono le "intestazioni ridondanti"?
cat $(ls -t)
è anche vulnerabile all'espansione del nome file. Se esiste un nome file con un'espressione parentesi *
, o ?
, oppure (ad es. file-[old].html
); e se il nome file interpretato come modello corrisponde ad altri nomi di file; l'approccio produrrà un elenco errato. set -f
affronterebbe questa carenza.
ls -Q
può produrre output per cui non è adatto xargs
. Ad esempio, "foo"
diventa "\"foo\""
, ma xargs non comprende le virgolette doppie con escape tra stringhe tra virgolette doppie.
Il modo più semplice per elencare i file in un ordine diverso da quello lessicografico è con i qualificatori di zsh glob . Senza zsh, puoi usare ls
, ma analizzare l'output di ls
è irto di pericoli .
cat *(om)
Se si desidera eliminare alcune righe, utilizzare sed o awk o perl. Ad esempio, per prendere il <head>
dal primo file e combinare le <body>
parti dagli altri file, supponendo che i tag <body>
e </body>
siano soli su una riga in ogni file:
{
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
Spiegazione:
concatenated.html
viene creato. È quindi il *.html
file più giovane (supponendo che nessun file abbia una data futura.*.html
file più giovane , ma esci dalla </body>
riga.<body>
linea e inizia con la </body>
linea.La soluzione fornita da @angus è buona ma avrà problemi se ci sono directory nella cartella che lo risolveranno.
cat $(ls -tpa | grep -v / )
cat $(ls -t) > outputfile
, altrimenticat
rifiuta i nomi dei file citati