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


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 8  
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  
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  
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  
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  
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; 03-13-2019 at 08:46 AM..
# 13  
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; 03-14-2019 at 04:56 AM.. Reason: Add option using stat utility with mtime instead of the extra overhead needed to get the crtime.
# 14  
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 for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Finding non-existing words in a list of files in a directory and its sub-directories

Hi All, I have a list of words (these are actually a list of database table names separated by comma). Now, I want to find only the non-existing list of words in the *.java files of current directory and/or its sub-directories. Sample list of words:... (8 Replies)
Discussion started by: Bhanu Dhulipudi
8 Replies

2. UNIX for Advanced & Expert Users

Find all files in the current directory excluding hidden files and directories

Find all files in the current directory only excluding hidden directories and files. For the below command, though it's not deleting hidden files.. it is traversing through the hidden directories and listing normal which should be avoided. `find . \( ! -name ".*" -prune \) -mtime +${n_days}... (7 Replies)
Discussion started by: ksailesh1
7 Replies

3. UNIX for Dummies Questions & Answers

List the directories, having given pattern in the directories name, sorted by creation date

It is for HP-Unix B.11.31. Requirement: 1. List the directories, having given pattern in the directories name, sorted by creation date. Example: Directories with name "pkg32*" or "pkg33*" 2. On the output of 1. list the directories by creation date as sort order, with creation date... (2 Replies)
Discussion started by: Siva SQL
2 Replies

4. Shell Programming and Scripting

Find specific files only in current directory...not sub directories AIX

Hi, I have to find specific files only in the current directory...not in the sub directories. But when I use Find command ... it searches all the files in the current directory as well as in the subdirectories. I am using AIX-UNIX machine.Please help.. I am using the below command. And i am... (2 Replies)
Discussion started by: aakishore
2 Replies

5. Shell Programming and Scripting

How to list all the files, directories and sub-directories in the current path except one directory?

Can anyone come up with a unix command that lists all the files, directories and sub-directories in the current directory except a folder called log.? Thank you in advance. (7 Replies)
Discussion started by: Manjunath B
7 Replies

6. Shell Programming and Scripting

List files in the current directory - BOURNE SHELL

i am trying to write a program, that will list .txt files and .png files. it will ask the user what type of files do they want to list! so if the user inputs txt files.. how would you list all the .txt files in the current directory (the directory the program is running)!! thanks (1 Reply)
Discussion started by: bshell_1214
1 Replies

7. Shell Programming and Scripting

mget * (obtein files from current directory but not the files form sub-directories)

Hello, Using the instruction mget (within ftp) and with "Interactive mode off", I want to get all files from directory (DirAA), but not the files in sub-directories. The files names don't follow any defined rule, so they can be just letters without (.) period Directory structure example: ... (0 Replies)
Discussion started by: Peter321
0 Replies

8. Shell Programming and Scripting

Finding files in current directory when 100,000's files in current directory

Hi All I was wondering what is the most efficient way to find files in the current directory(that may contain 100,000's files), that meets a certain specified file type and of a certain age. I have experimented with the find command in unix but it also searches all sub directories. I have... (2 Replies)
Discussion started by: kewong007
2 Replies

9. UNIX for Dummies Questions & Answers

List files that are not directories from current directory

I can't manage to list all files that are not directories from current directory. (2 Replies)
Discussion started by: beni22sof
2 Replies

10. Solaris

shell-init: could not get current directory: getcwd: cannot access parent directories

Hello root@ne-ocadev-1:/root/scripts>su espos -c find /a35vol100/ESPOS/oracle/db/9.2.0/oradata/ESPOS/archive -type f -atime +10 -exec ls {} shell-init: could not get current directory: getcwd: cannot access parent directories: Permission denied find: insufficient number of... (6 Replies)
Discussion started by: babu.knb
6 Replies

Featured Tech Videos