this post was submitted on 31 Jan 2025
12 points (80.0% liked)

Linux Mint

1901 readers
3 users here now

Linux Mint is a free Linux-based operating system designed for use on desktop and laptop computers.

Want to see the latest news from the blog? Set the Firefox homepage to:

linuxmint.com/start/

where is a current or past release. Here's an example using release 21.1 'Vera':

https://linuxmint.com/start/vera/

founded 3 years ago
MODERATORS
 

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!



EDIT: Thanks for the awesome help guys! The next part of this is to move all the .html files into one folder (named "done"), prepending their name with an integer. So far I got:

n=1; for f in *; do find ./"$f" -type f | sort | xargs mv done/"$n$f"; n=$((n+1)); done

but that is... not really doing anything. The closest I have gotten so far is some error like

mv: Missing destination file operand

Any help is again appreciated!

you are viewing a single comment's thread
view the rest of the comments
[โ€“] harsh3466@lemmy.ml 1 points 4 days ago (6 children)

It won't work the way you need it to as is, since the find command will first move all of those files together into the same folder, and if there are similar names between folder, like:

folder1/file1
folder2/file1

Then it will throw errors and/or overwrite files.

I'm at work so I can't loom at this right now but I'll look at it later when I get home.

[โ€“] skaarl@feddit.nl 2 points 4 days ago (5 children)

Yea, I just came back to say this. Since cp overwrites by default (I tried copying first before trying moving) and each folder has files named index001 index002 etc then then folder where they all go has only ONE of index001.html, ONE of index002.html etc. So I think what I need to do is find each html file, rename it with a unique integer in front of the name, move it to the common folder.

[โ€“] harsh3466@lemmy.ml 1 points 3 days ago (3 children)

Okay, took me awhile to write everything up. The script itself is pretty short, but it's still much easier to do in a script than to try to make this a one line command.

I tested this creating a top level directory, and then creating three subdirectories inside it with a different number of html files inside those directories, and it worked perfectly. I'm going to break down exactly what's going on in the script, but do note the two commented commands. I set this script up so you can test it before actually executing it on your files. In the breakdown of the script I'm going to ignore the testing command as if it were not in the script.

The script:

#! /bin/bash

# script to move all html files from a series of directories into a single directory, and rename them as they are moved by adding a numeric indicator
# to the beginning of the filename, while keeping files of the same folder grouped.

fileList="$(find ~/test -name '*.html' | sort)"

num=1

while IFS= read -r line; do

	pad="$(printf '%03d' $num)"

	#The below echo command will test the script to ensure it works. 
	#The output to the terminal will show the mv command for each file.
	#If the results are what you want, you can comment this line out to disable the command, or delete it entirely.

	echo "mv $line ~/done/"$pad${line##*/}""

	#This commented out mv command will actually move and rename all of the files.
	#When you are certain based on the testing that the script will work as desired
	#uncomment this line to allow the command to run and move & rename the files.

	# mv $line ~/done/"$pad${line##*/}"
	((num++))

done<<<"$fileList"

The breakdown of the script is in the reply comment. Lemmy wouldn't let me post it as one comment.

[โ€“] skaarl@feddit.nl 2 points 2 days ago (1 children)

Hey I finally got to try this out and tbh I hit Enter without understanding the whole thing ๐Ÿคญ๐Ÿคซ but anyway it's perfect! And it left me with a lot to study, your explanation was really helpful. Thanks so much for all your help! I really appreciate the time you spent :)

[โ€“] harsh3466@lemmy.ml 1 points 10 hours ago

Excellent! I'm glad it worked for you. :)

load more comments (1 replies)
load more comments (2 replies)
load more comments (2 replies)