mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
ls: ignore leading period when sorting by name (#2112)
* ls: ignore leading period when sorting by name ls now behaves like GNU ls with respect to sorting files by ignoring leading periods when sorting by main. Added tests to ensure "touch a .a b .b ; ls" returns ".a a .b b" * Replaced clone/collect calls.
This commit is contained in:
+7
-1
@@ -1139,7 +1139,13 @@ fn sort_entries(entries: &mut Vec<PathData>, config: &Config) {
|
||||
entries.sort_by_key(|k| Reverse(k.md().as_ref().map(|md| md.len()).unwrap_or(0)))
|
||||
}
|
||||
// The default sort in GNU ls is case insensitive
|
||||
Sort::Name => entries.sort_by_cached_key(|k| k.file_name.to_lowercase()),
|
||||
Sort::Name => entries.sort_by_cached_key(|k| {
|
||||
let has_dot: bool = k.file_name.starts_with('.');
|
||||
let filename_nodot: &str = &k.file_name[if has_dot { 1 } else { 0 }..];
|
||||
// We want hidden files to appear before regular files of the same
|
||||
// name, so we need to negate the "has_dot" variable.
|
||||
(filename_nodot.to_lowercase(), !has_dot)
|
||||
}),
|
||||
Sort::Version => entries.sort_by(|k, j| version_cmp::version_cmp(&k.p_buf, &j.p_buf)),
|
||||
Sort::None => {}
|
||||
}
|
||||
|
||||
@@ -481,6 +481,21 @@ fn test_ls_sort_name() {
|
||||
.arg("--sort=name")
|
||||
.succeeds()
|
||||
.stdout_is(["test-1", "test-2", "test-3\n"].join(sep));
|
||||
|
||||
// Order of a named sort ignores leading dots.
|
||||
let scene_dot = TestScenario::new(util_name!());
|
||||
let at = &scene_dot.fixtures;
|
||||
at.touch(".a");
|
||||
at.touch("a");
|
||||
at.touch(".b");
|
||||
at.touch("b");
|
||||
|
||||
scene_dot
|
||||
.ucmd()
|
||||
.arg("--sort=name")
|
||||
.arg("-A")
|
||||
.succeeds()
|
||||
.stdout_is([".a", "a", ".b", "b\n"].join(sep));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user