rechercher et exécuter sur le nom de fichier uniquement

1

Je dois rechercher tous les fichiers de plus de X jours et les supprimer localement, ainsi que dans mon compartiment s3. Le problème est que la commande find me renvoie aussi le chemin complet et le nom du fichier. J'ai essayé de jouer avec Basename et quelques autres choses, mais je ne pouvais pas le faire fonctionner. Toute aide serait grandement appréciée.

Pour le moment, la partie "supprimer localement" est ls au lieu de rm pendant que je jouais avec. Pour le rm j'ai besoin du chemin complet.

J'ai besoin de se déshabiller / home / ec2-user / backups / sur les appels s3cmd.

$ 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
KisnardOnline
la source
1
Quel est le problème avec rm full-path-and-filename?
David Dai
Comme je l'ai mentionné, j'ai besoin du chemin complet pour la machine ... c'est la partie s3cmd qui ne fonctionne pas avec un chemin complet.
KisnardOnline

Réponses:

1

Cela peut être fait de plusieurs manières. La combinaison de find -print0 et xargs -0 est puissant et sûr de travailler en combinaison avec sed -z (en utilisant NULL comme séparateur de ligne):

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

Puisque s3cmd ne prend pas (encore) en charge la suppression de plusieurs fichiers, xargs a besoin -n 1 pour limiter l'exécution à une ligne à la fois.

Une autre façon, peut-être plus simple, consiste à diriger find à travers read et utilisez la substitution de variable bash:

find /home/ec2-user/backups -type f -mtime +3 |\
  while read file; do s3cmd del ${file#*ups/}; done
Ziggy Crueltyfree Zeitgeister
la source
la commande que j'ai besoin d'exécuter n'est pas rm ... c'est s3cmd del s3: // kisnardonline / {}. La partie rm fonctionne bien.
KisnardOnline
@KisnardOnline c'est maintenant corrigé, plus une autre option ajoutée
Ziggy Crueltyfree Zeitgeister
1
la deuxième partie a fonctionné .. merci beaucoup !! find / home / ec2-user / backups -type f -mtime +3 | en lisant le fichier; faire s3cmd del s3: // kisnardonline / $ {fichier # * ups /}; terminé
KisnardOnline
0

Essayez cette modification simple:

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

Ainsi tous les chemins retournés par find est relative à /home/ec2-user/backups/ et commence par ./. Cela fonctionnera si s3cmd et / ou le serveur s3 est assez intelligent pour interpréter ./ comme il se doit (c.-à-d. s3://foo/./bar est égal à s3://foo/bar etc.).

s3cmd ne fonctionne pas avec ./

Dans ce cas:

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
Kamil Maciorowski
la source
s3cmd ne fonctionne pas avec ./
KisnardOnline
J'ai édité ma réponse pour satisfaire s3cmd qui ne fonctionne pas avec ./.
Kamil Maciorowski