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\