Hello everyone!

I had a container with a DB crap itself yesterday so I’m trying to speed up my learning to back up stuff.

I came across a script that taught me how to back-up a containerized postgres db at given intervals and it works. I managed to create db dumps and restore them. I’ve documented everything and now my whole docker-compose/env etc are on git control.

There’s one part of the script I don’t decypher but I’d like to maybe change it. It is about the number of back-up copies.

Here’s the line from the tutorial: ls -1 /backup/*.dump | head -n -2 | xargs rm -f

Can someone explain to me what this line does? I’d like to keep maybe 3 copies just in case the auto-backup backs up a rotten one.

Thanks!

Full code below:

backup:
    image: postgres:13
    depends_on:
      - db_recipes
    volumes:
      - ./backup:/backup
    command: >
      bash -c "while true; do
        PGPASSWORD=$$POSTGRES_PASSWORD pg_dump -h db-postgresql -U $$POSTGRES_USER -Fc $$POSTGRES_DB > /backup/$$(date +%Y-%m-%d-%H-%M-%S).dump
        echo ""Backup done at $$(date +%Y-%m-%d_%H:%M:%S)""
        ls -1 /backup/*.dump | head -n -2 | xargs rm -f
        sleep 86400
      done"
  • tburkhol@lemmy.world
    link
    fedilink
    English
    arrow-up
    0
    ·
    1 year ago

    Others have explained the line.

    Worth noting that not all implementations of head accept negative line counts (i.e. last n lines), and you might substitute tail.

    i.e.: ls -1 /backup/*.dump | tail -2 | xargs rm -f

    • doeknius_gloek@feddit.de
      link
      fedilink
      English
      arrow-up
      0
      ·
      edit-2
      1 year ago

      Yeah, tail would be the more obvious choice instead of negating head.

      Fuck, I need coffee. @klay@lemmy.world is right (again).

  • doeknius_gloek@feddit.de
    link
    fedilink
    English
    arrow-up
    0
    ·
    edit-2
    1 year ago

    This line seems to list all dumps and then deletes all but the two most recent ones.

    In detail:

    • ls -1 /backup/*.dump lists all files ending with .dump alphabetically inside the /backup directory
    • head -n -2 returns all filenames except the two most recent ones from the end of the list
    • xargs rm -f passes the filenames to rm -f to delete them

    Take a look at explainshell.com.