diff --git a/README.md b/README.md index a814864..35e0447 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # find-images Find images (sort by last modified by default). Useful for piping into sxiv/nsxiv when hidden subfiles/directories are significant. + +## Find non-images +obtain non-image files by giving any extension to `--extensions` diff --git a/prebuilt-x86-64-linux/find-images b/prebuilt-x86-64-linux/find-images index f439b4d..82a7267 100755 Binary files a/prebuilt-x86-64-linux/find-images and b/prebuilt-x86-64-linux/find-images differ diff --git a/src/main.rs b/src/main.rs index 6e50ffb..96e2172 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ extern crate chrono; extern crate shlex; extern crate structopt; +use crate::structopt::StructOpt; +use std::collections::HashSet; use std::io::Write; use std::path::{Path,PathBuf}; -use crate::structopt::StructOpt; #[derive(StructOpt)] #[structopt(about="Recursively get images")] @@ -24,6 +25,10 @@ struct CLIArguments { help="Escape paths")] quote: bool, + #[structopt(short, long, value_name="EXT", + help="File extensions to filter for (default: jpg jpeg png webp gif heic tiff dpx exr svg)")] + extensions: Vec, + #[structopt(value_name="TARGET", help="Target files and directories (recursive)\n If none specified, current working directory is implied")] targets: Vec, @@ -38,13 +43,19 @@ fn main() -> Result<(), Box>{ args }; + let valid_extensions: HashSet<&str> = if args.extensions.is_empty() { + ["jpg", "jpeg", "png", "webp", "gif", "heic", "tiff", "dpx", "exr", "svg"].into_iter().collect() + } else { + args.extensions.iter().map(|s| s.as_str()).collect() + }; + let mut registry: Vec = Vec::new(); args.targets.into_iter().map(|target| Path::new(&target).to_path_buf() ).for_each( |path| if path.is_file() { - register_file_if_image(&mut registry, path); + register_file_if_image(&mut registry, path, &valid_extensions); } else if path.is_dir() { - register_dir(&mut registry, path, args.dohidden); + register_dir(&mut registry, path, &valid_extensions, args.dohidden); } ); @@ -70,13 +81,11 @@ fn main() -> Result<(), Box>{ Ok(()) } -fn register_file_if_image(registry: &mut Vec, path: PathBuf) { - let image_extensions: std::collections::HashSet<&str> = ["jpg", "jpeg", "png", "webp", "gif", "heic", "tiff", "dpx", "exr", "svg"].into_iter().collect(); - +fn register_file_if_image(registry: &mut Vec, path: PathBuf, valid_extensions: &HashSet<&str>) { if let Some(osstr_ext) = path.extension() { match osstr_ext.to_str() { Some(ext) => { - if image_extensions.contains(ext) { + if valid_extensions.contains(ext) { registry.push(path); } }, @@ -89,7 +98,7 @@ fn register_file_if_image(registry: &mut Vec, path: PathBuf) { } } -fn register_dir(registry: &mut Vec, path: PathBuf, dohidden: bool) { +fn register_dir(registry: &mut Vec, path: PathBuf, valid_extensions: &HashSet<&str>, dohidden: bool) { if let Ok(entries) = std::fs::read_dir(path) { for path in entries.filter_map(|e| e.ok() ).map(|e| e.path() ) { if !dohidden && path.file_name().map(|name| name.to_string_lossy().starts_with('.')).unwrap_or(false) { @@ -100,9 +109,9 @@ fn register_dir(registry: &mut Vec, path: PathBuf, dohidden: bool) { continue } if path.is_file() { - register_file_if_image(registry, path); + register_file_if_image(registry, path, valid_extensions); } else if path.is_dir() { - register_dir(registry, path, dohidden); + register_dir(registry, path, valid_extensions, dohidden); } } }