Bash function to find newest file matching pattern
The ls
command has a parameter -t
to sort by time. You can then grab the first (newest) with head -1
.
ls -t b2* | head -1
But beware: Why you shouldn't parse the output of ls
My personal opinion: parsing ls
is only dangerous when the filenames can contain funny characters like spaces or newlines. If you can guarantee that the filenames will not contain funny characters then parsing ls
is quite safe.
If you are developing a script which is meant to be run by many people on many systems in many different situations then I very much do recommend to not parse ls
.
Here is how to do it "right": How can I find the latest (newest, earliest, oldest) file in a directory?
unset -v latest
for file in "$dir"/*; do
[[ $file -nt $latest ]] && latest=$file
done
How to follow (tail -f) the latest file (matching a pattern) in a directory and call as alias with parameter
tail -f "$(find . -maxdepth 1 -name "logfile*" -printf "%Ts/%f\n" | sort -n | tail -1 | cut -d/ -f2)"
Tail the result of the find command. Search for files prefixed with logfile in the current directory and print the epoch time of creation as well as the file path and name, separated by a forward slash Pipe this through to sort and then print the latest entry with tail -1 before stripping out to to leave only the file path with cut.
Get most recent file in a directory on Linux
ls -Art | tail -n 1
Not very elegant, but it works.
Used flags:
-A
list all files except .
and ..
-r
reverse order while sorting
-t
sort by time, newest first
How to recursively find the latest modified file in a directory?
find . -type f -printf '%T@ %p\n' \
| sort -n | tail -1 | cut -f2- -d" "
For a huge tree, it might be hard for sort
to keep everything in memory.
%T@
gives you the modification time like a unix timestamp, sort -n
sorts numerically, tail -1
takes the last line (highest timestamp), cut -f2 -d" "
cuts away the first field (the timestamp) from the output.
Edit: Just as -printf
is probably GNU-only, ajreals usage of stat -c
is too. Although it is possible to do the same on BSD, the options for formatting is different (-f "%m %N"
it would seem)
And I missed the part of plural; if you want more then the latest file, just bump up the tail argument.
Get the latest file in directory
Add the -d
argument to ls. That way it will always print just what it's told, not look inside directories.
Related Topics
How to Detect Invalid Utf8 Unicode/Binary in a Text File
How to Shutdown a Spring Boot Application in a Correct Way
What Killed My Process and Why
Print a File, Skipping the First X Lines, in Bash
Kdevtmpfsi Using the Entire Cpu
Multiline Bash Command in Jenkins Pipeline
How to Concatenate Multiple Lines of Output to One Line
Change the X-Frame-Options to Allow All Domains
Remove a Specific Character Using Awk or Sed
How to Simulate Just One Enter in Command Line After Executing a Jar File
Error:13 - Permission Denied Android Studio
Curl Command to Repeat Url Request
Format and Then Convert Txt to CSV Using Shell Script and Awk
Convert String to Hexadecimal on Command Line