List all files and directories in the current directory separated by commas and sorted by crtime


Login or Register to Reply

 
Thread Tools Search this Thread
# 8  
Old 1 Week Ago
I doubt that this will work on Ubuntu systems either, but it might be worth a try. The operating system I'm using doesn't have the debugfs or findmnt utilities and the date utility doesn't have a -d option, but the following code seems to do what I think you're trying to do.
Code:
crtime-at() {
	stat -t '%Y-%m-%d %H:%M:%S' -f '%SB%t%N%n' * | sort | awk '
		NR > 1 {printf("%s,", last) }
		{	last = $0 }
		END {	print last }'
}

if your shell allows hyphen characters in function names (which is not portable and is not required by the standards) and your system has a BSD based version of the stat utility.

Unfortunately, the stat utility is not specified by the standards either so methods used to print a file's creation time (if the file system the files reside on keeps a file's creation time [which is not required by the standards]) varies from system to system and the methods used to specify strftime()-like format strings for printing dates varies from system to system (with some systems not providing creation dates nor any way to get the date/time format you want).

If nothing else, maybe the above code will show you how to use awk to convert a sorted text file into a single line output with input lines separated by commas instead of <newline>s.

This was tested on macOS Mojave version 10.14.3 with a BSD-based stat utility (probably with macOS extensions). Note that this version just sorts on the YYYY-mm-dd HH:MM:SS date/time stamps instead of trying to get a finer grained timestamp using UNIX Epoch times.

I have no idea what the stat utility man page on your system says about printing file creation dates or about ways to specify the format of dates that are to be printed.
# 9  
Old 1 Week Ago
Hey Don!

If you need a Linux server to log into and try commands I have a Linode Ubuntu server I can create an account for you.

Let me know!
# 10  
Old 1 Week Ago
Hi Tim,
It's too late tonight (i.e. this morning) for me. I need some sleep.

But, if you e-mail me details on how to login to your Ubuntu system, I'll play around with it later today.

Cheers,
Don
# 11  
Old 1 Week Ago
Thanks Don!
I'll also like to try your system out tomorrow.
In the meantime, I will make the changes you suggested.

It's good to have so much help. This is the way to code -Smilie
# 12  
Old 1 Week Ago
On (plain) Ubuntu systems, you won't get a file's crtime from stat, as its %w "format sequence" supplies 0, or "-", respectively:

Code:
Access: 2019-03-13 11:43:18.362189910 +0100
Modify: 2019-03-09 20:25:05.000000000 +0100
Change: 2019-03-13 11:48:32.571558428 +0100
Birth: -

The debugfs crtime entry might be closer to the desired result, but isn't it strange that it is later than mtime?

Code:
  ctime: 0x5c88e000:88452870 -- Wed Mar 13 11:48:32 2019
  atime: 0x5c88dec6:565a5158 -- Wed Mar 13 11:43:18 2019
  mtime: 0x5c841311:00000000 -- Sat Mar  9 20:25:05 2019
 crtime: 0x5c84136a:ba74cad4 -- Sat Mar  9 20:26:34 2019


Quote:
Originally Posted by chstewar
... figure out how to get i displayed as a comma separated list.
...
You could simply pipe your result list through

Code:
 | paste -sd,


Last edited by RudiC; 1 Week Ago at 07:46 AM..
# 13  
Old 1 Week Ago
Here is a slightly optimized version of your code that should run a little bit faster and produce the output I think you're trying to get.
Code:
#!/bin/bash
crtime-at() {
	fs=$(findmnt -n -o SOURCE --target "$PWD")
	ls -id * | while read -r inode target
	do
		crtime=$(sudo debugfs -R "stat <$inode>" "${fs}" 2> /dev/null |
		    grep -oP 'crtime.*--\s*\K.*')
		crtime=$(date -d "$crtime" '+%Y-%m-%d %H:%M:%S')
		printf '%s\t%s\n' "$crtime" "$target"
	done | sort | paste -sd,
}
crtime-at
cd /tmp
crtime-at

This was tested on Ubuntu running release 4.15.0-32-generic. Unfortunately, as noted by RudiC on this Ubuntu release, the stat utility only shows - for the birth time (aka struct stat crtime field) of a file and the ls utility has no option to print (or sort) on the creation timestamp of a file even if the underlying file system stores this data. I used the paste as RudiC suggested since it should be more efficient than the awk code I suggested in an earlier post in this thread. I didn't observe the mtime before crtime on any of the files I observed on Ubuntu, but that abnormality certainly could be created with a C or C++ program or using the touch utility.

If you want to switch to using mtime instead of crtime you could just use stat and make your loop much simpler as suggested before by using:
Code:
 stat --printf='%y\t%n\n' * | sort | paste -sd,

If you don't like the sub-seconds and the offset from GMT in the output that produces, those artifacts could very simply be removed if you go back to a slightly modified version of the awk code I suggested instead of using paste.

I moved the check for the filesystem out of the loop since all files in a directory are by definition in the same filesystem. And, we can get the inode numbers and the file names names from ls directly without needing to invoke ls a second time and invoking cut inside the loop to extract it. The two invocations of your function after its definition were used by me to verify the output I was getting. Feel free to replace that code with whatever else you were doing in your script.

If there's anything in this version of your function that you don't understand, ask and I'll try to explain it for you.

I hope this helps.

Last edited by Don Cragun; 1 Week Ago at 03:56 AM.. Reason: Add option using stat utility with mtime instead of the extra overhead needed to get the crtime.
# 14  
Old 1 Week Ago
Just for the fun of it (and be aware that eval comes with its known problems):

Code:
for FN in *; do  eval $(stat -c"sudo debugfs -R 'stat <%i>' \$(grep %m /etc/mtab| cut -d' ' -f1)" $FN) 2>/dev/null | sed -n "/^crtime.*--/{s///;s/$/ $FN/p}" ; done  | paste -sd,

Unfortunately, stat and debugfs aren't mutually compatible, e.g. in the fields that they use and output.
Login or Register to Reply

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
How to create a summary file of all files in a directory sorted in reverse alphabetical order.? Braveheart UNIX for Beginners Questions & Answers 4 11-28-2016 03:17 PM
Finding non-existing words in a list of files in a directory and its sub-directories Bhanu Dhulipudi Shell Programming and Scripting 8 01-12-2016 08:35 AM
Find all files in the current directory excluding hidden files and directories ksailesh1 UNIX for Advanced & Expert Users 7 02-03-2014 05:09 AM
List the directories, having given pattern in the directories name, sorted by creation date Siva SQL UNIX for Dummies Questions & Answers 2 05-05-2013 12:45 AM
Shell Code required -Output in Multiple Rows to be in single row separated by Commas - manishK Shell Programming and Scripting 4 04-07-2013 12:33 PM
Find specific files only in current directory...not sub directories AIX aakishore Shell Programming and Scripting 2 11-28-2012 10:40 PM
How to list all the files, directories and sub-directories in the current path except one directory? Manjunath B Shell Programming and Scripting 7 09-13-2012 10:00 AM
List matching directories in current folder only on AIX sachinkl Emergency UNIX and Linux Support 6 02-24-2012 04:13 AM
List files in the current directory - BOURNE SHELL bshell_1214 Shell Programming and Scripting 1 09-20-2011 03:59 AM
List directories and sub directories recursively excluding files pointers UNIX for Dummies Questions & Answers 3 02-23-2011 08:39 PM
mget * (obtein files from current directory but not the files form sub-directories) Peter321 Shell Programming and Scripting 0 03-12-2009 11:59 AM
Finding files in current directory when 100,000's files in current directory kewong007 Shell Programming and Scripting 2 02-26-2009 02:13 PM
List files that are not directories from current directory beni22sof UNIX for Dummies Questions & Answers 2 01-06-2009 02:44 PM
shell-init: could not get current directory: getcwd: cannot access parent directories babu.knb Solaris 6 10-03-2008 10:11 AM
searching content of files in the current and sub directories tiger99 Shell Programming and Scripting 4 01-23-2008 02:11 AM