
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.txt
davor:
blah blah blah
blahblah blahblah
Zeile in der Datei filename_ghrut.txt
nach:
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 perl
undfind
find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
s/$/ $ARGV/
Fügen Sie am Ende jeder Zeile ein Leerzeichen und einen Dateinamen hinzu-i
für die Bearbeitung direkt vor Ort,i.bkp
wenn Sie eine Sicherungskopie der Originaldateien behalten möchten- Wenn Ihr
find
nicht unterstützt+
, verwenden Sie\;
stattdessen find . -type f
gibt eine Liste aller Dateien im aktuellen Verzeichnis-exec
ermö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.txt
Vielen 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|.*\/| |r
gibt 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 inplace
as versucht zunächst, die Erweiterung (as oder ) aus dem aktuellen Arbeitsverzeichnis gawk
zu laden , wo jemand Malware platziert haben könnte. Der Pfad der mit gelieferten Erweiterung kann je nach System unterschiedlich sein, siehe die Ausgabe voninplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
Antwort3
Versuchen Sie Folgendes mit find
und sed
:
find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;
Ersetzen Sie /path/to/top_directory
durch das Verzeichnis, in dem sich die Dateien befinden, die Sie bearbeiten möchten.