Was ist der schnellste und pragmatischste Weg, um alle * .txt-Dateien in einem Verzeichnis in einer großen Textdatei zu kombinieren?
Derzeit verwende ich Windows mit Cygwin, damit ich Zugriff auf BASH habe.
Windows-Shell-Befehl wäre auch schön, aber ich bezweifle, dass es einen gibt.
echo *.txt | xargs cat > all.txt
Denken Sie daran, dass die Shell bei allen bisher angegebenen Lösungen die Reihenfolge festlegt, in der die Dateien verkettet werden. Für Bash, IIRC, ist das eine alphabetische Reihenfolge. Wenn die Reihenfolge wichtig ist, sollten Sie die Dateien entweder entsprechend benennen (01file.txt, 02file.txt usw.) oder jede Datei in der Reihenfolge angeben, in der sie verkettet werden soll.
quelle
Der Windows-Shell-Befehl
type
kann dies tun:Der
type
Befehl type schreibt auch Dateinamen in stderr, die nicht vom>
Umleitungsoperator erfasst werden (sondern auf der Konsole angezeigt werden).quelle
Sie können die Windows-Shell verwenden,
copy
um Dateien zu verketten.Aus der Hilfe:
quelle
Seien Sie vorsichtig, da keine dieser Methoden mit einer großen Anzahl von Dateien funktioniert. Persönlich habe ich diese Zeile verwendet:
EDIT: Als jemand in den Kommentaren gesagt, können Sie ersetzen
$(ls | grep ".txt")
mit$(ls *.txt)
BEARBEITEN: Dank der Erfahrung von @gnourf_gnourf ist die Verwendung von glob die richtige Methode, um Dateien in einem Verzeichnis zu durchlaufen . Folglich müssen blasphemische Ausdrücke wie
$(ls | grep ".txt")
durch ersetzt werden*.txt
(siehe Artikel hier ).Gute Lösung
quelle
for i in $(ls *.txt);do cat $i >> output.txt;done
?ls | grep
es sich um ein ernsthaft schlechtes Antimuster handelt).ls *.txt
scheitern, wenn zu viele Dateien vorhanden sind (Argumentliste zu langer Fehler)?Der pragmatischste Weg mit der Shell ist der Befehl cat. andere Möglichkeiten umfassen,
quelle
cat
Methode die letzte und die erste Zeile benachbarter Dateien verkettet.Wie wäre es mit diesem Ansatz?
quelle
-maxdepth 1
demfind
Befehl hinzufügen .sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
Beispielsweise:
Das nimmt alle txt-Dateien im Ordner C: \ und speichert sie im Ordner C: \ 1 unter dem Namen all.txt
Oder
Beispielsweise:
Dadurch werden alle im Ordner vorhandenen Dateien übernommen und der Inhalt in C: \ 1 \ all.txt abgelegt
quelle
Sie können dies tun:
cat [directory_path]/**/*.[h,m] > test.txt
Wenn Sie
{}
die Erweiterung der Dateien verwenden, die Sie suchen möchten, liegt ein Sequenzierungsproblem vor.quelle
Wenn Sie auf ein Problem stoßen, bei dem all.txt in all.txt umgewandelt wird, können Sie versuchen, zu überprüfen, ob all.txt vorhanden ist oder nicht, falls vorhanden, entfernen Sie es
So was:
[ -e $"all.txt" ] && rm $"all.txt"
quelle
cat *.txt > all.txt
>
Befehl überschreibt all.txt, falls vorhanden,>>
fügt Daten zu vorhandener Datei hinzudas alles ist böse ....
einfaches Zeug.
quelle
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;