[ale] Bash script SOLVED
Ron
admin at bclug.ca
Wed Apr 16 22:38:51 EDT 2025
Boris Borisov via Ale wrote on 2025-04-12 14:42:
> I'm trying to list all files on SSD disk (Windows) and to find the
> oldest file and the newest file.
This was way, *way*, WAY harder than expected.
Here's how to find the newest and oldest files / directories across a
disk - adjust the starting point to suit your mount point:
find $mount -printf "%TY-%Tm-%Td %TH:%TM:%TS %p\0" \
| sort --zero-terminated \
| tr '\0' '\n' \
| less
Then, look at top and bottom lines of output.
Switch `less` for `head -n 1` or `tail -n 1` for seeing single lines of
output.
Note, this method will handle files with new lines in the file name
(that was a rabbit hole! What a terrible idea).
So, a breakdown on what it's doing:
> find $mount
Will find all files and folders starting at $mount
> -printf "%TY-%Tm-%Td %TH:%TM:%TS %p\0"
Will print to the screen "YYYY-MM-DD HH:MM:SS filename[NULL]" format
(NULL is important for line-feed filenames, unlikely on a Windows disk)
> \
Code continues on next line...
> | sort --zero-terminated \
Pipe to `sort` command, letting it know that lines are delimited with
nulls (x00) instead of newlines
> | tr '\0' '\n' \
Translate those nulls back to newlines
> | less
Lets one view the results.
Tested on ~/ which contains > 2,779,286 entries and returned results
from 1927 (?!?) at the top through to today at the bottom.
Bonus: to get just the newest and oldest items, this will work
*sometimes* but fails sometimes, and I'm not sure why - if anyone can
explain, I'd love to hear it:
find $mount -printf "%TY-%Tm-%Td %TH:%TM:%TS %p\0" \
| sort --zero-terminated \
| tr '\0' '\n' \
| tee >(head -n 1) >(tail -n 1) > /dev/null
That final line will output everything, and send it to `head -n 1` and
send it to `tail -n 1` then send the "everything" output from `tee` to
/dev/null, leaving just the output from `head` and `tail`.
An example where it does work:
$ ll /tmp/test -trA
total 0
-rw-rw-r-- 1 uid1 uid1 0 1999-01-01 00:00 file1
-rw-rw-r-- 1 uid1 uid1 0 2020-01-01 00:00 'file!'
-rw-rw-r-- 1 uid1 uid1 0 2025-01-01 00:00 file2
$ find /tmp/test/ -printf "%TY-%TM-%Td %TH:%Tm:%TS %p\0" \
| sort --zero-terminated
| tr '\0' '\n' \
| tee >(head -n 1) >(tail -n 1) > /dev/null
1999-00-01 00:01:00.0000000000 /tmp/test/file1
2025-44-16 18:04:07.9633502140 /tmp/test/
Let us know what you find...
This was an interesting project: poorly documented `find` options,
discovery of files on my disk with "\n" in the name, how to deal with
"\n" in file names, brush-up on printf format options, first usage of
`sort --zero-terminated`, first use of multiple sub-shells,...
Probably couldn't have done it without AI assistance (https://you.com)
but it was a bit niche even for that.
More information about the Ale
mailing list