So fügen Sie am Ende jeder Zeile einen Dateinamen hinzu - alle Dateien in allen Unterverzeichnissen

So fügen Sie am Ende jeder Zeile einen Dateinamen hinzu - alle Dateien in allen Unterverzeichnissen

Ich möchte meinem Bash-Skript (Ubuntu 16) eine Zeile hinzufügen, um den Dateinamen am Ende jeder Zeile in einer Datei hinzuzufügen – das heißt, an das Ende jeder Datei in einem Ordner und aller Dateien in allen Unterordnern.

Dateinamen sind alphanumerisch mit einigen Sonderzeichen wie -_.

Zum Beispiel:

Zeile in der Datei filename_ghrut.txtdavor:

blah blah blah
blahblah blahblah

Zeile in der Datei filename_ghrut.txtnach:

blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt

Ich habe gesucht, aber die meisten Befehle scheinen nicht zu funktionieren.

Ich möchte dies für alle Dateien in allen Unterordnern eines bestimmten Verzeichnisses ausführen.

Vielen Dank.

Ich habe das hier gefunden, aber es funktioniert nicht ganz:

ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %

Antwort1

Mit perlundfind

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/Fügen Sie am Ende jeder Zeile ein Leerzeichen und einen Dateinamen hinzu
  • -ifür die Bearbeitung direkt vor Ort, i.bkpwenn Sie eine Sicherungskopie der Originaldateien behalten möchten
  • Wenn Ihr findnicht unterstützt +, verwenden Sie \;stattdessen
  • find . -type fgibt eine Liste aller Dateien im aktuellen Verzeichnis
  • -execermöglicht die Verwendung eines Befehls zur Bearbeitung aller Dateien
  • Verwenden Sie diese Option find . -type f -name '*.txt', wenn Sie nur Dateien mit der Endung.txt


./file.txtVielen Dank @thiagowfx für den Hinweis, dass die obige Lösung Dateinamen als , ./foo/file2.txt, usw. hinzufügt

./Verwenden Sie dies, um nur den Dateinamen ohne usw. hinzuzufügen .

find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
  • $ARGV=~s|.*\/| |rgibt den Dateinamen zurück, aus dem alle Zeichen bis /entfernt sind

Antwort2

Mit GNU awk:

LC_ALL=C find . -type f -exec gawk -i /usr/share/awk/inplace.awk '
  BEGINFILE {suffix = FILENAME; sub(/.*\//, "", suffix)}
  {print $0, suffix}' {} +

Beachten Sie, dass bei mehreren Hardlinks derselben Datei der Name jedes Links (in keiner bestimmten Reihenfolge) zu jeder Zeile dieser Datei hinzugefügt wird.

In jedem Fall,verwende nicht-i inplaceas versucht zunächst, die Erweiterung (as oder ) aus dem aktuellen Arbeitsverzeichnis gawkzu laden , wo jemand Malware platziert haben könnte. Der Pfad der mit gelieferten Erweiterung kann je nach System unterschiedlich sein, siehe die Ausgabe voninplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

Antwort3

Versuchen Sie Folgendes mit findund sed:

find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;

Ersetzen Sie /path/to/top_directorydurch das Verzeichnis, in dem sich die Dateien befinden, die Sie bearbeiten möchten.

verwandte Informationen