diff options
author | Lars Wirzenius <liw@liw.fi> | 2018-10-02 09:31:22 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2018-10-02 09:31:22 +0300 |
commit | 7d818831a3712e307731bf5be28bc876874f8b39 (patch) | |
tree | d915b9686b701bd45108be64da259f4348dc6e66 /src | |
parent | 8e186e739f133297cb2dd4761dbfae5566f7b75e (diff) | |
download | summainrs-7d818831a3712e307731bf5be28bc876874f8b39.tar.gz |
Change: really use walkdir crate
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/src/main.rs b/src/main.rs index cac0646..79736c4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,9 @@ use std::os::unix::fs::PermissionsExt; use std::os::linux::fs::MetadataExt; use std::io::prelude::*; +extern crate walkdir; +use walkdir::{WalkDir, DirEntry}; + extern crate users; extern crate chrono; @@ -16,83 +19,93 @@ use crypto_hash::{Algorithm, Hasher}; extern crate hex; -mod fswalk; -use fswalk::DirTree; - // Command line args are names of dirs, recursively list all files and // dirs them fn main() -> io::Result<()> { for dirname in env::args().skip(1) { - let tree = DirTree::new(&dirname); - for entry in tree { - write_info(&entry.path(), &entry.metadata()); + for e in WalkDir::new(&dirname).into_iter().filter_map(|e| e.ok()) { + write_info(&e); } } Ok(()) } -fn write_info(path: &str, meta: &fs::Metadata) { - println!("Name: {}", path); - println!("Mtime: {}", format_mtime(meta)); - println!("Mode: {}", format_mode(meta)); - println!("Ino: {}", format_inode(meta)); - println!("Dev: {}", format_dev(meta)); - println!("Nlink: {}", format_nlink(meta)); - println!("Size: {}", format_size(meta)); - println!("Uid: {}", format_uid(meta)); - println!("Username: {}", format_username(meta)); - println!("Gid: {}", format_gid(meta)); - println!("Group: {}", format_group(meta)); - println!("SHA256: {}", format_sha256(path)); +fn write_info(e: &DirEntry) { + println!("Name: {}", format_name(e)); + println!("Mtime: {}", format_mtime(e)); + println!("Mode: {}", format_mode(e)); + println!("Ino: {}", format_inode(e)); + println!("Dev: {}", format_dev(e)); + println!("Nlink: {}", format_nlink(e)); + println!("Size: {}", format_size(e)); + println!("Uid: {}", format_uid(e)); + println!("Username: {}", format_username(e)); + println!("Gid: {}", format_gid(e)); + println!("Group: {}", format_group(e)); + println!("SHA256: {}", format_sha256(e)); println!(""); } -fn format_mtime(meta: &fs::Metadata) -> String { +fn format_name(e: &DirEntry) -> String { + e.path().to_string_lossy().to_string() +} + + +fn format_mtime(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); let mtime = meta.modified().unwrap(); let datetime = DateTime::<Utc>::from(mtime); datetime.format("%Y-%m-%d %H:%M:%S.%f %z").to_string() } -fn format_mode(meta: &fs::Metadata) -> String { +fn format_mode(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); let mode = meta.permissions().mode(); format!("{:06o}", mode) } -fn format_inode(meta: &fs::Metadata) -> String { +fn format_inode(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.st_ino()) } -fn format_dev(meta: &fs::Metadata) -> String { +fn format_dev(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.st_dev()) } -fn format_nlink(meta: &fs::Metadata) -> String { +fn format_nlink(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.st_nlink()) } -fn format_size(meta: &fs::Metadata) -> String { +fn format_size(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.len()) } -fn format_uid(meta: &fs::Metadata) -> String { +fn format_uid(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.st_uid()) } -fn format_gid(meta: &fs::Metadata) -> String { +fn format_gid(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); format!("{}", meta.st_gid()) } -fn format_username(meta: &fs::Metadata) -> String { +fn format_username(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); if let Some(u) = users::get_user_by_uid(meta.st_uid()) { format!("{}", u.name()) } else { @@ -101,7 +114,8 @@ fn format_username(meta: &fs::Metadata) -> String { } -fn format_group(meta: &fs::Metadata) -> String { +fn format_group(e: &DirEntry) -> String { + let meta = e.metadata().unwrap(); if let Some(g) = users::get_group_by_gid(meta.st_gid()) { format!("{}", g.name()) } else { @@ -110,10 +124,10 @@ fn format_group(meta: &fs::Metadata) -> String { } -fn format_sha256(filename: &str) -> String { +fn format_sha256(e: &DirEntry) -> String { let mut ok = true; let mut hasher = Hasher::new(Algorithm::SHA256); - if let Ok(file) = fs::File::open(filename) { + if let Ok(file) = fs::File::open(e.path()) { let mut reader = io::BufReader::new(file); let mut buf = [0; 1024 * 1024]; let mut done = false; |