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!

  • harsh3466
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    4 hours ago

    Here’s what’s happening in the command;

    for f in *; do

    You already know this for loop, which is using the * glob to iterate over each directory in the current directory.

    find ./"$f" -type f

    Instead of your original ls command, which gives the file names, and not their full paths, we’re using GNU find, which outputs the full path of what it finds. The arguments are:

    ./"$f" - This tells find where to start its search. I double qouted the $f variable to properly expand the directory name even if it has nonstandard characters in it like spaces.

    -type f - This tells find what kind of file object to look for. So it’s two parts. -type to tell find there will be a specific type to look for, and the f flag, which means file. Meaning, it will only find files

    The output of find is not sorted alaphabetically, so before piping the output to tail, we first pipe it to sort, which by default will sort alphanumerically, which we then pipe to tail to grab just the last two files, and finally we get to the xargs bit.

    Here I added the -n 1 argument to xargs to get it to work on the files one at a time. This isn’t actually necessary. You could just run it as xargs rm. I didn’t realize that before I posted the command. (I’m still learning too! The learning never ends. :D )

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

      Thanks so much harsh!!! I will study this and hit Enter after I understand it.

      Thanks again, that’s epic.

      • harsh3466
        link
        fedilink
        arrow-up
        1
        ·
        4 hours ago

        You’re welcome! Happy I could help.

        One other quick note, do the filenames or directories have spaces in them? If they do, that will cause a problem with the command as it is and need some additional modification. I accounted for the possible spaces in the directory names with the find command, but not with xargs. I just realized that as I was looking it over again.