Come posso concatenare tutti i file in una determinata directory in ordine di data, dove voglio il file più recente in cima?


18

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:


33

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.htmlsi presume che siano due nomi di file: Mye file.html. Puoi fare una lscitazione 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"?


Questo non funziona sul mio sistema debian ... Devo usare cat $(ls -t) > outputfile, altrimenti catrifiuta i nomi dei file citati
Mike Pennington,

1
Errore mio. Sono sempre preso da queste cose. Vedi la risposta aggiornata.
angus,

Oh - per intestazioni ridondanti intendo cose che normalmente vengono inserite in alcuni file header.php / footer.php, ma che vengono salvate separatamente quando salvate in HTML (e possono davvero aumentare le dimensioni del file quando scarichi in massa pagine PHP).
InquilineKea

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 -faffronterebbe questa carenza.
A piedi nudi IO

ls -Qpuò 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.
A piedi nudi IO

2

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:

  • Innanzitutto, concatenated.htmlviene creato. È quindi il *.htmlfile più giovane (supponendo che nessun file abbia una data futura.
  • Quindi copia dal secondo *.htmlfile più giovane , ma esci dalla </body>riga.
  • Quindi copia dagli altri file, ma salta tutto sulla <body>linea e inizia con la </body>linea.
  • Infine produce gli ultimi tag di chiusura.

1

La soluzione fornita da @angus è buona ma avrà problemi se ci sono directory nella cartella che lo risolveranno.

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


Avvertenza: questa risposta è anche vulnerabile all'espansione del nome percorso, come spiegato nel mio commento alla risposta di angus.
A piedi nudi IO

A meno che lo stato di uscita di cat non sia testato, un argomento della directory dovrebbe essere irrilevante. cat emetterà semplicemente un messaggio a stderr e procederà all'argomento successivo.
A piedi nudi IO
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.