Home > Blockchain >  find the last created subdirectory in a directory of 500k subdirs
find the last created subdirectory in a directory of 500k subdirs

Time:03-24

I have a folder with some 500k subfolders - and I would like to find the last directory which was added to this folder. I am having to do this due to a power failure issue :(

I dont excatly know when the power failed, so using this:

find . -type d -mmin -360 -print

which I beleive is the last 360 minutes? However, gives me results which I am not exactly sure of.

Shortly speaking, I would like to get the last directory which was created within this folder.

Any pointers would be great.

CodePudding user response:

Suggesting :

 find . -type d -printf "%C@ %p\n" |sort -n|tail -n1|awk '{print $2}'

Explanation:

find . -type d -printf "%C@ %p\n"

find . start searching from current directory recursively

-type d search only directory files

-printf "%C@ %p\n" for each directory print its last change time in secs from Unix epoch time including sec fraction, followed by file name with path.

For example: 1648051886.4404644000 /tmp/mc-dudi

|sort -n|tail -n1

Sort the result from find as numbers, and print the last row.

awk '{print $2}'

From last row, print only second field

CodePudding user response:

You might try this: it shows your last modification date/time in a sortable manner, and by sorting it, the last entry should be the most recent one:

find ./ -exec ls -dils --time-style=long-iso {} \; | sort -k8,9

Edit: and specific for directories:

find ./ -type d -exec ls -dils --time-style=long-iso {} \; | sort -k8,9

CodePudding user response:

Assuming you're using a file system that tracks file creation ('birth' is the usual terminology) times, and GNU versions of the programs used below:

find . -type d -exec stat --printf '%W\t%n\0' \{\}   | sort -z -k1,1nr | head -1 -z | cut -f 2-

This will find all subdirectories of the current working directory, and for each one, print its birth time (The %W format field for stat(1)) and name (The %n format). Those entries are then sorted based on the timestamp, newest first, and the first line is returned minus the timestamp.

Unfortunately, GNU find's -printf doesn't support birth times, so it calls out to stat(1) to get those, using the multi-argument version of -exec to minimize the number of instances of the program that need to be run. The rest is straightforward sorting of a column, using 0-byte terminators instead of newlines to robustly handle filenames with newlines or other funky characters in them.

CodePudding user response:

Mantaining a symbolic link to the last known subdirectory could avoid listing all of them to find the latest one.

ls -dl $(readlink  ~/tmp/last_dir)
drwxr-xr-x 2 lmc users 4096 Jan 13 13:20 /home/lmc/Documents/some_dir

Find newer ones

ls -ldt $(find -L . -newer ~/tmp/last_dir -type d ! -path .)
drwxr-xr-x 2 lmc users   6 Mar  1 00:00 ./dir2
drwxr-xr-x 2 lmc users   6 Feb  1 00:00 ./dir1

Or

ls -ldt $(find -L . -newer ~/tmp/last_dir -type d ! -path .) | head -n 1
drwxr-xr-x 2 lmc users   6 Mar  1 00:00 ./dir2

CodePudding user response:

Don't use the chosen answer if you really want to find the last created sub-directory

According to the question:

  1. Directories should be sorted by creation time instead of modification time.
  2. find --mindepth 1 is necessary because we want to search only sub-directories.

Here are 2 solutions that both fulfill the 2 requirements:

GNU

find . -mindepth 1 -type d -exec stat -c '%W %n' '{}' ' ' |
  sort -nr | head -n1

BSD

find . -mindepth 1 -type d -exec stat -f '%B %N' '{}' ' ' |
  sort -nr | head -n1
  •  Tags:  
  • bash
  • Related