Hi,

Here's a patch for ls, to have it sort directories before anything else.. the 
new option is -e.. I could have sworn it was in an older version of 
fileutils, but I'm probably dreaming out loud :)

[11:21][Lurch]$ /bin/ls -le
total 8
drwxr-xr-x    2 lurch    users        4096 Oct 27 11:21 adir1
drwxr-xr-x    2 lurch    users        4096 Oct 27 11:21 zdir2
-rw-r--r--    1 lurch    users           0 Oct 27 11:21 afile1
-rw-r--r--    1 lurch    users           0 Oct 27 11:21 zfile2
[11:21][Lurch]$ /bin/ls -l
total 8
drwxr-xr-x    2 lurch    users        4096 Oct 27 11:21 adir1
-rw-r--r--    1 lurch    users           0 Oct 27 11:21 afile1
drwxr-xr-x    2 lurch    users        4096 Oct 27 11:21 zdir2
-rw-r--r--    1 lurch    users           0 Oct 27 11:21 zfile2
[11:21][Lurch]$ 

Regards,
Gerrit
--- fileutils-4.1/src/ls.c	2001-04-29 11:42:47.000000000 +0200
+++ fileutils-4.1-mod/src/ls.c	2002-08-12 18:25:25.000000000 +0200
@@ -297,6 +297,10 @@
 				    const struct fileinfo *file2));
 static int rev_cmp_version PARAMS ((const struct fileinfo *file2,
 				    const struct fileinfo *file1));
+static int compare_directories PARAMS ((const struct fileinfo *file1,
+			                const struct fileinfo *file2));
+static int rev_cmp_directories PARAMS ((const struct fileinfo *file2,
+                                        const struct fileinfo *file1));
 static int decode_switches PARAMS ((int argc, char **argv));
 static int file_interesting PARAMS ((const struct dirent *next));
 static uintmax_t gobble_file PARAMS ((const char *name, enum filetype type,
@@ -431,7 +435,8 @@
     sort_extension,		/* -X */
     sort_time,			/* -t */
     sort_size,			/* -S */
-    sort_version		/* -v */
+    sort_version,		/* -v */
+    sort_dirs			/* -e */
   };
 
 static enum sort_type sort_type;
@@ -1076,7 +1081,7 @@
     }
 
   while ((c = getopt_long (argc, argv,
-			   "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
+			   "abcdefghiklmnopqrstuvw:xABCDFGHI:LNQRST:UX1",
 			   long_options, NULL)) != -1)
     {
       switch (c)
@@ -1101,6 +1106,10 @@
 	  immediate_dirs = 1;
 	  break;
 
+	case 'e':
+	  sort_type = sort_dirs;
+	  break;
+
 	case 'f':
 	  /* Same as enabling -a -U and disabling -l -s.  */
 	  all_files = 1;
@@ -2169,6 +2178,9 @@
     case sort_version:
       func = sort_reverse ? rev_cmp_version : compare_version;
       break;
+    case sort_dirs:
+      func = sort_reverse ? rev_cmp_directories : compare_directories;
+      break;
     default:
       abort ();
     }
@@ -2317,6 +2329,33 @@
   return cmp;
 }
 
+static int
+compare_directories(const struct fileinfo *file1, const struct fileinfo *file2)
+{
+  if (file1->filetype == directory && file2->filetype == directory)
+	return strcoll(file1->name, file2->name);
+  if (file1->filetype == directory)
+        return -1;
+  if (file2->filetype == directory)
+        return 1;
+
+  return strcoll(file1->name, file2->name);
+}
+
+static int
+rev_cmp_directories(const struct fileinfo *file2, const struct fileinfo *file1)
+{
+  if (file1->filetype == directory && file2->filetype == directory)
+	return strcoll(file1->name, file2->name);
+  if (file1->filetype == directory)
+        return -1;
+  if (file2->filetype == directory)
+        return 1;
+
+  return strcoll(file1->name, file2->name);
+}
+
+
 /* List all the files now in the table.  */
 
 static void
@@ -3267,6 +3306,7 @@
       --color[=WHEN]         control whether color is used to distinguish file\n\
                                types.  WHEN may be `never', `always', or `auto'\n\
   -d, --directory            list directory entries instead of contents\n\
+  -e                         sort directories first, then sort files\n\
   -D, --dired                generate output designed for Emacs' dired mode\n\
   -f                         do not sort, enable -aU, disable -lst\n\
   -F, --classify             append indicator (one of */=@|) to entries\n\

Reply via email to