find und exec nur mit Dateiname

889
KisnardOnline

Ich muss alle Dateien suchen, die älter als X Tage sind, und sie lokal und aus meinem s3-Bucket löschen. Das Problem ist, dass der Befehl find den vollständigen Pfad und Dateinamen zurückgibt. Ich habe versucht, mich mit basename und einigen anderen Dingen zu beschäftigen, konnte es aber nicht zum Laufen bringen. Jede Hilfe wäre sehr dankbar.

Im Moment ist der Teil "Löschen Sie sie lokal" ls statt rm, während ich damit herumspielte. Für die RM brauche ich den vollen Pfad.

Ich muss / home / ec2-user / backups / aus den s3cmd-Aufrufen entfernen.

$ find /home/ec2-user/backups -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;  /home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz File s3://kisnardonline//home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz deleted 
1
Was ist los mit `rm full-path-and-filename`? David Dai vor 8 Jahren 1
Wie gesagt, ich brauche den vollständigen Pfad für den RM ... es ist der s3cmd-Teil, der nicht mit einem vollständigen Pfad arbeitet. KisnardOnline vor 8 Jahren 0

2 Antworten auf die Frage

1
Ziggy Crueltyfree Zeitgeister

Es gibt mehrere Möglichkeiten, dies zu erreichen. Die Kombination von find -print0und xargs -0ist leistungsfähig und sicher in Kombination mit sed -z(Verwendung von NULL als Trennzeichen):

find /home/ec2-user/backups -type f -mtime +3 -print0 |\ sed -z 's/^.*\?backups/s3:\//' |\ xargs -0 -n 1 s3cmd del 

Da s3cmddas Löschen mehrerer Dateien (noch) nicht unterstützt wird, xargsmuss -n 1die Ausführung auf jeweils eine Zeile begrenzt werden.

Ein anderer Weg, vielleicht einfacher, ist mit dem Rohr finddurch readund verwenden bash Variablensubstitution:

find /home/ec2-user/backups -type f -mtime +3 |\ while read file; do s3cmd del $; done 
Der Befehl, den ich ausführen muss, ist nicht rm ... es ist s3cmd del s3: // kisnardonline / {}. Der rm-Teil funktioniert gut. KisnardOnline vor 8 Jahren 0
@KisnardOnline ist jetzt behoben und eine weitere Option hinzugefügt Ziggy Crueltyfree Zeitgeister vor 8 Jahren 0
zweiter teil hat funktioniert .. vielen dank !! find / home / ec2-user / backups -type f -mtime +3 | während gelesene Datei; do s3cmd del s3: // kisnardonline / $ ; erledigt KisnardOnline vor 8 Jahren 1
0
Kamil Maciorowski

Versuchen Sie diese einfache Modifikation:

cd /home/ec2-user/backups/; find -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

Auf diese Weise ist jeder zurückgegebene Pfad findrelativ zu /home/ec2-user/backups/und beginnt mit ./. Es funktioniert, wenn s3cmdund / oder der s3-Server klug genug ist, um ./die Art und Weise zu interpretieren, wie er sollte (dh s3://foo/./bargleich s3://foo/barusw.).

s3cmd funktioniert nicht mit ./

In diesem Fall:

cd /home/ec2-user/backups/; find -type f -mtime +3 | while read F ; do ls "$F"; F="`echo $F | cut -c 3-`"; s3cmd del "s3://kisnardonline/$F"; done 
s3cmd funktioniert nicht mit ./ KisnardOnline vor 8 Jahren 0
Ich habe meine Antwort bearbeitet, um s3cmd zu befriedigen, was mit ./ nicht funktioniert. Kamil Maciorowski vor 8 Jahren 0