diff --git a/README.md b/README.md index 9d475bf80..5fef24a87 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,7 @@ eza’s options are almost, but not quite, entirely unlike `ls`’s. - **-D**, **--only-dirs**: list only directories and links to directories - **-f**, **--only-files**: list only files and links to files - **--only-links**: list only symbolic links +- **--no-links**: don't list symbolic links in **--only-files** or **--only-dirs** cases - **--git-ignore**: ignore files mentioned in `.gitignore` - **-I**, **--ignore-glob=(globs)**: glob patterns (pipe-separated) of files to ignore diff --git a/man/eza.1.md b/man/eza.1.md index 5e5d099e7..362d06941 100644 --- a/man/eza.1.md +++ b/man/eza.1.md @@ -150,6 +150,8 @@ Sort fields starting with a capital letter will sort uppercase before lowercase: `--only-links` : List only links +`--only-links` +: Don't show links in `--only-files` or `--only-dirs` cases LONG VIEW OPTIONS ================= diff --git a/src/fs/filter.rs b/src/fs/filter.rs index 390c1e6cb..83ed15890 100644 --- a/src/fs/filter.rs +++ b/src/fs/filter.rs @@ -24,6 +24,9 @@ pub enum FileFilterFlags { /// Whether to only show links. OnlyLinks, + + /// Whether to ignore links. + NoLinks, } /// The **file filter** processes a list of files before displaying them to @@ -77,7 +80,7 @@ impl FileFilter { /// Remove every file in the given vector that does *not* pass the /// filter predicate for files found inside a directory. pub fn filter_child_files(&self, files: &mut Vec>) { - use FileFilterFlags::{OnlyDirs, OnlyFiles, OnlyLinks}; + use FileFilterFlags::{NoLinks, OnlyDirs, OnlyFiles, OnlyLinks}; files.retain(|f| !self.ignore_patterns.is_ignored(&f.name)); @@ -88,15 +91,25 @@ impl FileFilter { ) { (true, false, false) => { // On pass -'-only-dirs' flag only - files.retain(File::points_to_directory); + if self.flags.contains(&NoLinks) { + files.retain(File::is_directory); + } else { + files.retain(File::points_to_directory); + } } (false, true, false) => { // On pass -'-only-files' flag only - files.retain(File::points_to_file); + if self.flags.contains(&NoLinks) { + files.retain(File::is_file); + } else { + files.retain(File::points_to_file); + } } (false, false, true) => { // On pass -'-only-links' flag only - files.retain(File::is_link); + if !self.flags.contains(&NoLinks) { + files.retain(File::is_link); + } } _ => {} } diff --git a/src/options/filter.rs b/src/options/filter.rs index 6f4363793..c5e3ae6fa 100644 --- a/src/options/filter.rs +++ b/src/options/filter.rs @@ -19,6 +19,7 @@ impl FileFilter { (matches.has(&flags::ONLY_DIRS)?, FFF::OnlyDirs), (matches.has(&flags::ONLY_FILES)?, FFF::OnlyFiles), (matches.has(&flags::ONLY_LINKS)?, FFF::OnlyLinks), + (matches.has(&flags::NO_LINKS)?, FFF::NoLinks), ] { if *has { filter_flags.push(flag.clone()); diff --git a/src/options/flags.rs b/src/options/flags.rs index 24d857969..7d61686e2 100644 --- a/src/options/flags.rs +++ b/src/options/flags.rs @@ -36,6 +36,7 @@ pub static DIRS_FIRST: Arg = Arg { short: None, long: "group-directories-first" pub static ONLY_DIRS: Arg = Arg { short: Some(b'D'), long: "only-dirs", takes_value: TakesValue::Forbidden }; pub static ONLY_FILES: Arg = Arg { short: Some(b'f'), long: "only-files", takes_value: TakesValue::Forbidden }; pub static ONLY_LINKS: Arg = Arg { short: None, long: "only-links", takes_value: TakesValue::Forbidden }; +pub static NO_LINKS: Arg = Arg { short: None, long: "no-links", takes_value: TakesValue::Forbidden }; const SORTS: Values = &[ "name", "Name", "size", "extension", "Extension", "modified", "changed", "accessed", "created", "inode", "type", "none" ]; diff --git a/src/options/help.rs b/src/options/help.rs index 53dd10c96..ec794ebd3 100644 --- a/src/options/help.rs +++ b/src/options/help.rs @@ -40,6 +40,7 @@ FILTERING AND SORTING OPTIONS -D, --only-dirs list only directories and links to directories -f, --only-files list only files and links to files --only-links list only symbolic links + --no-links don't list symbolic links in --only-files or --only-dirs cases -I, --ignore-glob GLOBS glob patterns (pipe-separated) of files to ignore"; static GIT_FILTER_HELP: &str = " \