[UNIX]Verwijderen van files > 1 dag werkt niet

Pagina: 1
Acties:

  • Deathchant
  • Registratie: September 2003
  • Laatst online: 06-02 16:16

Deathchant

Don't intend. Do!

Topicstarter
Hallo mensen

Ik denk dat het iets simpels is, maar ik krijg het niet voor elkaar.
Ik heb een sh scriptje gebouwd en ik wil daarin programmeren dat er in 1 bepaalde directory, alle files die beginnen met "alarm" in de filenaam en ouder zijn dan 1 dag worden verwijderd.

Hier is een commando voor namelijk:

find /directorynaam/alarm* -atime +1 -print | xargs rm -f

Ik heb dus in de directory 3 files staan van 29 november. Dus deze 3 files zouden gewoon moeten worden verwijderd met dat commando.
Maar de -print laat geen gevonden files zien. Als ik -atime -1 doe, verwijdert hij me ALLE files beginnend met "alarm" ongeacht hoe oud ze zijn.

Ik heb het in de CRONTAB zo gedaan dat er elke dag op 3 tijdstippen mijn script uitgevoerd wordt en in dat script moet die regel staan om die files te verwijderen. Maar het werkt niet.
Ik weet niet waar het aan ligt....

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Wat heeft dit met programmeren te maken? Dat je toevallig een shell scriptje gebruikt is irrelevant, je begrijpt gewoon een bepaald commando niet. Daar kan men je in Non-Windows Operating Systems veel beter mee helpen. ;)

PW>>NOS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Wat bedoel je precies met "1 dag oud"? 1 dag geleden laatste access, of 1 dag geleden laatste modificatie? En welke "unix" gaat het over hier? Wat zegt de manpage over -atime en -*time?

  • Deathchant
  • Registratie: September 2003
  • Laatst online: 06-02 16:16

Deathchant

Don't intend. Do!

Topicstarter
Sorry voor de misplaatsing hoor.

ik wil gewoon die files verwijderen die ouder zijn dan 1 dag. DWZ files die niet gemodified zijn. Dus atime. mtime is modified file ongeacht hoe oud de files zijn

-atime n
True if the file was accessed n days ago. The access
time of directories in path is changed by find itself.
-mtime n
True if the file's data was modified n days ago.

EDIT:
Er vanuitgaand dat er elke dag een file gemaakt wordt in mijn directory door een bepaalde applicatie:

optie1:
Als ik de ATIME +1 gebruik dan krijg ik alle files te zien vanaf 28 november en verder terug
Als ik de MTIME +1 gebruik dan krijg ik alle files te zien vanaf 29 november en verder terug.

optie2:
Als ik de ATIME -1 gebruik dan krijg ik alle files te zien vanaf 2 december en verder terug
Als ik de MTIME -1 gebruik dan krijg ik alleen de files van december te zien, beginnend vanaf vandaag, dus van 2 en 1 december....

optie 2 moet ik dus niet hebben, want die zal me alle files tot op de dag van vandaag verwijderen.

[ Voor 82% gewijzigd door Deathchant op 02-12-2005 10:25 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

atime is access time, die wordt gezet zodra je het bestand opent, leest, etc. Volgens mij moet je dus mtime gebruiken.

En de * moet je escapen, anders parset de shell hem ipv find.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
find /directorynaam/alarm* -atime +1 -print | xargs rm -f
Je moet find een directory meegeven en geen bestandsnamen. Dus iets als
code:
1
find /directory -name "alarm*" -atime +1 -print
Volgens mij moet je ook -atime +0 gebruiken ipv +1, maar misschien is dit afhankelijk van welke find je gebruikt. Dat zou je dus eerst even moeten testen. Ipv xargs kan je ook de -exec optie van find gebruiken, maar dat is verder niet echt spannend.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Tenzij het om duizenden en duizenden bestanden gaat. Dan is xargs wel noodzakelijk.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Wilke
  • Registratie: December 2000
  • Laatst online: 13:07
Twee dingetjes: atime is 'last accessed' time. Dus niet de tijd van creatie. Overigens houd niet elk FS deze atime bij: het kost natuurlijk tijd om dat elke keer te updaten - daarom kun je het met 'noatime' uitzetten in de /etc/fstab. Daarvan afgezien bestaan er filesystems die het uberhaupt niet ondersteunen (vooral niet-native FS'en dan natuurlijk).

Waarschijnlijk wil je '-mtime' gebruiken, dat is de laatste keer dat het bestand gewijzigd is.

Een ander puntje: je kunt beter de optie '-print0' gebruiken (in plaats van -print) bij find, en dan bij xargs de optie '--null' opgeven. De bestandsnamen worden dan gescheiden door null-characters, het enige teken waarvan je echt 100% zeker weet dat ze niet in een bestandsnaam gaan voorkomen.

N.B. Pas je wel heeeeel goed op met de combinatie van 'find' en 'xargs rm'? Het is precies het soort commando waarmee je met 1 klein foutje je hele systeem goed kunt vernaggelen (vooral als je het test als root terwijl je het commando dus blijkbaar nog niet 100% goed hebt)

[ Voor 16% gewijzigd door Wilke op 02-12-2005 10:47 ]


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Tenzij het om duizenden en duizenden bestanden gaat. Dan is xargs wel noodzakelijk.
Dat is waar, maar hij heeft maar 3 bestanden ofzo.
Een ander puntje: je kunt beter de optie '-print0' gebruiken (in plaats van -print) bij find, en dan bij xargs de optie '--null' opgeven. De bestandsnamen worden dan gescheiden door null-characters, het enige teken waarvan je echt 100% zeker weet dat ze niet in een bestandsnaam gaan voorkomen.
Goede tip. Overigens is er nog een character wat nooit in een bestandsnaam kan zitten: /

  • Deathchant
  • Registratie: September 2003
  • Laatst online: 06-02 16:16

Deathchant

Don't intend. Do!

Topicstarter
het gaat zich dus wel om 1000den bestanden. Het gaat zich om 129.768 bestanden dus dat is nogal wat.

dan zou het dus worden

code:
1
find /directory/ -name "alarm*" -atime +1 -exec rm -f
OF
code:
1
find /directory/ -name "alarm*" -atime +1 | xargs rm -f


In ieder geval wel bedankt voor jullie commentaar.

[ Voor 19% gewijzigd door Deathchant op 02-12-2005 12:03 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Deathchant schreef op vrijdag 02 december 2005 @ 12:01:
het gaat zich dus wel om 1000den bestanden. Het gaat zich om 129.768 bestanden dus dat is nogal wat.

dan zou het dus worden

code:
1
find /directory/ -name "alarm*" -atime +1 -exec rm -f
nee
OF
code:
1
find /directory/ -name "alarm*" -atime +1 | xargs rm -f
nee

Ten eerste is dat niet de juiste syntax van -exec, en ten tweede, heb je uberhaupt het commentaar in dit topic over atime/mtime van wilke en mij gelezen?
En voor de tweede maal, wel OS gaat het hier over? Verschillende versies van find verwachten namelijk wel eens een andere tijdnotatie (dagen versus uren of minuten bijvoorbeeld).

  • Deathchant
  • Registratie: September 2003
  • Laatst online: 06-02 16:16

Deathchant

Don't intend. Do!

Topicstarter
niet zo vijandig hoor. Sorry als ik iets niet meteen de eerste keer begrijp.
ten eerste: ja ik heb jullie commentaar gelezen over atime en mtime. Ik heb ook
Het gaat zich hier om Sun dozen, waar ik op moet inloggen met PuTTY.

find . -name "alarm*" -mtime +1 -exec rm {} \;

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Het was niet zozeer vijandig, eerder dringend :)
De informatie die gevraagd werd en de tips die gegeven werden waren nogal handig om rekening mee te houden voor je met rm gaat scripten :)

  • zomertje
  • Registratie: Januari 2000
  • Laatst online: 03-02 16:28

zomertje

Barisax knorretje

Je kan ook rm even vervangen door mv naar een andere plek. Totdat alles goed werkt :)

het ultieme jaargetijde.... | #!/usr/bin/girl | Art prints and fun


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Als je echt >129000 bestanden wil verwijderen dan kan je beter met xargs werken. Het is wel een verschil met de 3 waar je het eerst over had.

Als je maar 3 bestanden wil verwijderen dan kan je het commando makkelijk testen door eerst alleen de namen te laten zien voordat je eea verwijderd. Als je heeeeel veel bestanden wil verwijderen en er maar een handjevol overhouden dan werkt dat natuurlijk niet. In dat geval kan je beter de bestanden verplaatsen naar een andere directory.
code:
1
2
mkdir /hiereerstevenbewaren
find /alarmdirectory -name "alarm*" -mtime +1 -print|xargs -I{} mv {} /hiereerstevenbewaren
NB maakt de bewaar directory niet aan onder de /alarmdirectory anders worden ze nogmaals gevonden.
Ik weet niet precies hoe het FS van Sun werkt, maar onder linux ext3 wordt bij het verplaatsen in ieder geval alleen de ctime veranderd.

  • devzero642
  • Registratie: November 2003
  • Niet online
Ik zie niet in waarom je xargs in dit geval zou gebruiken, als -exec prima werkt. Je hoeft je dan ook niet druk te maken of er spaties in de file naam kunnen voorkomen (hoewel print0 prima werkt).

Die mv werkt natuurlijk ook alleen als de alarm* files in de zelfde directory zitten en er geen hierachische structuur is.

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
devzero schreef op zaterdag 03 december 2005 @ 03:28:
Ik zie niet in waarom je xargs in dit geval zou gebruiken, als -exec prima werkt.
Snelheid.
10000 maal rm aanroepen voor 1 bestand, is veel minder snel dan 10x rm aanroepen voor 1000 bestanden. Bij 10 of 100 bestanden maakt dit niet zoveel uit, maar richting de duizenden scheelt het behoorlijk.
Testje ter illustratie:
code:
1
2
3
4
5
6
7
8
9
10
% time find . -exec echo {} > /dev/null \;

real    1m43.639s
user    0m26.879s
sys     0m58.771s
% time find . | xargs echo > /dev/null

real    0m0.424s
user    0m0.195s
sys     0m0.187s

Op een behoorlijk uitgebreide directory-structuur scheelt dat nogal dus :)

[ Voor 46% gewijzigd door blaataaps op 03-12-2005 11:43 ]


  • Deathchant
  • Registratie: September 2003
  • Laatst online: 06-02 16:16

Deathchant

Don't intend. Do!

Topicstarter
bedankt voor jullie nuttige posts. Ik heb zo'n literatuurschrift waarin ik al die handigheidjes even opschrijf, dan kan ik het altijd terugvinden. Dus bedankt!
Ik heb het nu inderdaad met -exec rm {} gedaan:
code:
1
find <directory> -type f -name "alarm" -mtime +1 -print -exec rm{}

en het werkt perfect. Momenteel gaat het toch om 50 files per week dus. In de toekomst gaan dit (zoals ik al aangaf) richting de 100.000...

Maar ik heb met een collega vandaag zoveel files moeten removen, maar het rm commando werkt niet eens. Volgens mij wordt de buffer gewoon te groot. Doe ik het zo:
code:
1
find <directory> -name "alarm" -mtime +1 | xargs rm -f

dan werkt het wel in 1x zonder een melding te krijgen dat het niet kan.

[ Voor 5% gewijzigd door Deathchant op 05-12-2005 12:02 ]

Canon: EOS R6 | EF 16-35/4L IS USM | EF 70-200/2.8L IS II USM
Zeiss: 35/2 Distagon | 50/2 Makro-Planar | 85/1.4 Planar | 100/2 Makro-Planar | 135/2 Apo Sonnar


  • Coen Rosdorff
  • Registratie: Januari 2000
  • Niet online
Deathchant schreef op maandag 05 december 2005 @ 12:00:
code:
1
find <directory> -name "alarm" -mtime +1 | xargs rm -f

dan werkt het wel in 1x zonder een melding te krijgen dat het niet kan.
Neem hier nog wel even een '-type f' in op voor de veiligheid.
Pagina: 1