As the title says, I just started with linux mint and am falling in love with bash scripts 😍 Actually I’m not sure if it’s considered a script, but I want to delete the last 2 files in all subfolders in a folder. So far I’ve (after great effort) got the terminal to list the files, but I want to delete them. Here is how I get them listed:

for f in *; do ls $f | tail -n 2; done

All their names come satisfyingly up in the terminal. Now what? I tried adding | xargs rm but that didn’t delete them. I also tried something with find command but that didn’t work either. Some folders have 3 items, so I want to delete #2 and 3. Some folders have 15 items so I want to delete #14 and 15. Folders are arranged by name, so it’s always the last 2 that I want to delete.

It’s frustrating to be sooooo clooooose, but also very fun. Any help is appreciated!

  • skaarl@feddit.nlOP
    link
    fedilink
    English
    arrow-up
    1
    ·
    5 hours ago

    for f in *; do ls $f | tail -n 2 | xargs rm -rf; done

    You mean like that? rm -rf followed by a question mark does not inspire confidence XD

    • harsh3466@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      51 minutes ago

      Additionally, for safety you can add the i flag to be promoted to confirm each removal. It may be tedious depending on the number of files, but it may also save you from deleting files and/or directories you don’t want deleted.

    • harsh3466@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      53 minutes ago

      For clarity, be careful with that -rf combo of flags. As another commenter mentioned, -r means recursive, which will delete directories and their contents. You’re talking about deleting files. If you do not want directories and their contents removed, DO NOT use the -r flag.

      • skaarl@feddit.nlOP
        link
        fedilink
        English
        arrow-up
        1
        ·
        38 minutes ago

        Thank you for the tips, but now I’m getting “Cannot remove: No such file or directory” all the way down! The files are there, I see them, they come up in the terminal, but for some reason xargs rm does not want to delete them. When I put the -f flag, rm doesn’t give an error but the files are still there! wtf

        • harsh3466@lemmy.ml
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          21 minutes ago

          When you run the command without the xargs bit, like this:

          for f in \*; do ls $f | tail -n 2; done\,

          Does the output give you the full file path, or just the file names?

          The full file path will look something like:

          /dir1/dir2/actual-file

          And of course the file name would just be:

          some-file

          If you’re getting just the file name, that’s the problem. Unless you’re in the directory with the file you wish to delete, rm needs the full path.

          Edit: grammar

          • skaarl@feddit.nlOP
            link
            fedilink
            English
            arrow-up
            1
            ·
            edit-2
            28 seconds ago

            Yea that must be it! It’s spitting out just the file name and not the whole path. There is only 1 level of depth, so I want to remove

            • ./folder1/file 3
            • ./folder1/file4
            • ./folder2/file11
            • ./folder2/file12

            so how do I get the whole path into xargs? I tried xargs "$f"/ but fortunately that didn’t work because it was trying to delete all the directories lmao XD

            • harsh3466@lemmy.ml
              link
              fedilink
              arrow-up
              1
              ·
              32 seconds ago

              I’m working on a new command to do this, give me a few minutes and I should have it.

    • huf [he/him]@hexbear.net
      link
      fedilink
      English
      arrow-up
      1
      ·
      5 hours ago

      this will break pretty badly if you have filenames with spaces or newlines in them. so to make this actually robust, you now get to learn about find -print0, xargs -0, and why you always, always need to add "" around variables in bash.

      • skaarl@feddit.nlOP
        link
        fedilink
        English
        arrow-up
        1
        ·
        39 minutes ago

        Can find be used with tail?

        Thank you for the tips, but now I’m getting “Cannot remove: No such file or directory” all the way down! The files are there, I see them, they come up in the terminal, but for some reason xargs rm does not want to delete them. When I put the -f flag, rm doesn’t give an error but the files are still there! wtf

        • huf [he/him]@hexbear.net
          link
          fedilink
          English
          arrow-up
          1
          ·
          32 minutes ago

          find can be used with tail, but if you’re doing nul-delimited stuff (-print0, -0), then you’ll want tail to run in nul-delimited mode too (-z apparently).

          or you can say “fuck files with newlines in them, i aint supporting that shit”, and then you just need the “” to still support filenames with spaces.

    • calm.like.a.bomb@lemmy.dbzer0.com
      link
      fedilink
      English
      arrow-up
      1
      ·
      5 hours ago

      yes. that’s what I suggested… the question mark was there to ask you if you tried that :-D I’m at work, pretty busy :-D I hope you read the rm manual.

      -r means recursive
      -f means force, which will delete the files/directories without interaction

      • skaarl@feddit.nlOP
        link
        fedilink
        English
        arrow-up
        1
        ·
        38 minutes ago

        Oh I see, lol. Now I’m getting “Cannot remove: No such file or directory” all the way down! The files are there, I see them, they come up in the terminal, but for some reason xargs rm does not want to delete them. When I put the -f flag, rm doesn’t give an error but the files are still there! wtf