Ich habe ein Bash-Skript zum Bereitstellen von Code aus einer Beta-Umgebung in einer Produktionsumgebung, aber derzeit muss ich die Liste der Dateien einer TXT-Datei manuell hinzufügen, und manchmal vermisse ich einige. Grundsätzlich kopiert mein Bereitstellungsskript cat / loops die Dateien über. (exporte / importe db auch aber das ist nicht relevant..lol)
Wie auch immer, ich möchte den find
Befehl verwenden, um eine Liste der Dateien zu erstellen, die in den letzten 14 Tagen geändert wurden. Das Problem ist, dass ich den Pfad entfernen ./
muss, damit das Bereitstellungsskript funktioniert.
Hier ist ein Beispiel für die Verwendung des Befehls find:
finden . -Typ f -mtime -14> deploy.txt
Hier ist die Zeile, die deploy.txt
in meinem Bereitstellungsskript vorkommt:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Haben Sie eine Idee, wie Sie dies mithilfe von Bash-Skripten erreichen können?
Vielen Dank!
--dry-run
Modus aus und geben Sie das zur Überprüfung in eine Datei aus?Antworten:
Sie können die
-printf
Befehlszeilenoption mit verwenden%f
, um nur den Dateinamen ohne Verzeichnisinformationen zu druckenoder Sie können sed verwenden, um nur die ./ zu entfernen
quelle
/.
.|
als Trennzeichen verwenden.%f
werden alle Verzeichnisse entfernt, nicht nur./
. Dadurch wird sein Bereitstellungsskript unterbrochen, wenn sich eine der von zurückgegebenen Dateienfind
in Unterverzeichnissen befindet..
. Und vielleicht am besten einen Startanker verwenden:s|^\./||
%P
anstelle von%f
. Dadurch wird nur der in der Befehlszeile angegebene Pfad abgeschnitten.Das
./
sollte harmlos sein. Die meisten Programme behandeln/foo/bar
und/foo/./bar
als gleichwertig. Mir ist klar, dass es nicht sehr schön aussieht, aber basierend auf dem, was Sie gepostet haben, sehe ich keinen Grund, warum es dazu führen würde, dass Ihr Skript fehlschlägt.Wenn Sie es wirklich ausziehen möchten,
sed
ist dies wahrscheinlich der sauberste Weg:Wenn Sie sich auf einem System mit GNU find befinden (z. B. auf den meisten Linux-Systemen), können Sie dies auf einmal tun
find -printf
:Das
%P
gibt den vollständigen Pfad jeder gefundenen Datei abzüglich des in der Befehlszeile angegebenen Pfads bis einschließlich des ersten Schrägstrichs zurück. Dadurch bleiben alle Unterverzeichnisse in Ihrer Verzeichnisstruktur erhalten.quelle
./
Präfix ist eigentlich ein Merkmal; Andernfalls funktioniert die Weiterleitung der Ausgabe an andere Befehle nicht ordnungsgemäß, z. B. für Dateinamen, die mit einem Bindestrich beginnen.Warum musst du das ausziehen
./
? Es ist gültig, in einem Pfad zu haben. Soist einfach ok!
Aber wenn Sie den Verzeichnisnamen in find
%P
entfernen möchten, können Sie das Argument to verwenden-printf
.man find (1) sagt:
Ein Beispiel
Achte auf die erste leere Zeile! Wenn Sie es vermeiden möchten, verwenden Sie
-mindepth 1
quelle
Nun, Sie haben ein paar Möglichkeiten. Sie können die
-printf
Option in find verwenden, um nur den Dateinamen auszudrucken, oder Sie können ein Tool wie sed verwenden, um den Dateinamen einfach zu entfernen./
.quelle
"find -printf" funktioniert unter FreeBSD nicht, weil find keine solche Option hat. In diesem Fall kann AWK helfen. Es gibt einen Nachnamen ($ NF) zurück, sodass es in jeder Tiefe funktionieren kann.
PS: Entnommen aus D.Tansleys "Linux and Unix Shell Programming" Buch
quelle
Eine schnelle Lösung
cut
für die Ausgabe desfind
Befehls ist, wenn ich die Frage richtig verstehe :Dies entfernt die ersten Zeichen aus jeder Zeile des Ergebnisses (in Ihrem Fall
./
). Wahrscheinlich nicht die beste Lösung, funktioniert aber in Ihrem Szenario.quelle
sed
ist perfekt für so etwas.quelle
Ich weiß nicht, um welche Art von Dateinamen es sich handelt, aber durch Leerzeichen oder Zeilenumbrüche sind die meisten Lösungen hier gefährdet.
Mein Vorschlag wäre, die Parametererweiterung der Shell zu verwenden, um die Zeichen aus jedem Dateinamen zu entfernen:
Wenn Sie Pipes wirklich wirklich mögen, können Sie ein "sicheres" Trennzeichen wie eine Null mit xargs verwenden, um jeden Dateinamen zu erhalten:
Denken Sie daran, dass die Ausgabe NICHT durch Nullen getrennt ist. Obwohl dies für eine Augapfelüberprüfung ausreichend ist, erstellt keine dieser Lösungen eine deploy.txt-Datei, die sicher für die Automatisierung verwendet werden kann, es sei denn, Sie sind sich Ihrer Quelle sehr sicher Dateinamen.
quelle