Linux: Suchen -> identifizieren -> umbenennen -> verschieben...

...komplette Frage anzeigen

2 Antworten

Hallo

  1. Umbenenne der gefundenen und identifizierten Datei in einen eindeutigen Namen. ([unixzeitstempel].php)

Umbenennen mit sed:

sed -s '/{ }/$(date +%d.%m.%G.%R|tr -s ':' ':'){ }/g'
  1. Verschieben der umbenannten Datei in ein definiertes Verzeichnis. (/var/backup)

Das man mit mv verschiebt solltest Du aber schon wissen:

mv {}  /var/backup

Das alles in eine Schleife:

for i in $(find /var/www -type f -name "*.php" -print0 | xargs -0 grep "inhaltssuchewort");
do
echi $i |   Hier die Umbenennung && Verschiebung einfügen;
done

Linuxhase

Ok. Versucht und als fehlerhaft befunden.

folgendes habe ich in ein script gepackt:

for i in $(find /var/www -type f -name "*.php" -print0 | xargs -0 grep "suchtext");
do
echo $i | sed -s '/{ }/$(date +%d.%m.%G.%R|tr -s ':' ':'){ }/g' | mv {} /var/backup;

Das Ergebnis war:

sed: -e Ausdruck #1, Zeichen 6: Unbekannter Befehl: `$'
mv: Aufruf von stat für .{}. nicht möglich: Datei oder Verzeichnis nicht gefunden

Was läuft da falsch?

0
@M0J01812

M0J01812

Ok. Versucht und als fehlerhaft befunden.

Das war von mir auch nicht als fertige Lösung, sondern allenfalls als "Hilfe zur Selbsthilfe" gedacht!


Ich würde sowieso anders vorgehen, wozu find benutzen um dann grep arbeiten zu lassen, macht doch keinen Sinn wenn der Pfad immer gleich ist!

for i in $(grep -H 'string1' /var/w-w-w/*.php|awk -F":" '{ print $1 }'); do cp $i /var/w-w-w/backup ; done ; for i in $(ls -1 /var/w-w-w/backup) ; do ; cd /var/w-w-w/backup && rename  's/php/$(date +%d.%m.%G.%R|tr -s ':' '-')/' *php
  1. string1 ist durch Dein inhaltssuchwort zu ersetzen
  2. Das Backup-Verzeichnis mußt Du an Deine Gegebenheiten anpassen
  3. Das w-w-w mußt Du auch richtig benennen (wegen der fehlenden Möglichkeit hier mehr Links zu posten)
  4. Probiere es erst so aus - Und mache es dann scharf, wenn das wie gewünscht klappt.

In einem Script wäre es aber übersichtlicher als in dem Einzeiler ;-)

Linuxhase

0

Tip: Das solltest Du als Shell-Skript schreiben. In einem Einzeiler geht das nicht mehr, vor allem weil der "*" unter Linux etwas anders funktioniert als unter Windows/DOS.

Evtl. hat linuxhase da was passendes auf seiner Festplatte.

ok... Die Funktion wie ich sie oben zitiert habe funktioniert und der Jack ( * ) erfüllt in diesem Zusammenhang tatsächlich die gleiche Funktion wie unter Windows. Da ja die gefundenen werde per xargs übergeben werden, sollte es in einem Einzeiler doch möglich sein da dort Befehlsabfolgen unterstützt werden... ich kann ja auch suchen per find, übergeben per xargs an grep und dann die Datei löschen. warum also nicht bewegen da ja mv schon von sich aus das umbenennen unterstützt. fraglich wäre nur die Möglichkeit des Zeitstempels in dieser Funktion.

Oder sollte ich mich da so sehr täuschen?

0
@M0J01812

Um Dein Vorhaben abzuwickeln (eine Menge n Dateien finden, umbenennen und verschieben) benötigst Du eine Schleife. Wie das in einem Einzeiler mit Pipes gehen soll, sehe ich noch nicht! Und bis dieser Einzeiler steht ist auch das Skript längst fertig und vor allem übersichtlicher.

Und Achtung: Auch wenn der (*) vergleichbare Ergebnisse liefert, so funktioniert er doch anders.

0

Was möchtest Du wissen?