Guest User

Untitled

a guest
Mar 18th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. extern crate chrono;
  2. extern crate libc;
  3. #[macro_use]
  4. extern crate structopt;
  5.  
  6. use std::fs;
  7. use std::path::PathBuf;
  8. use std::error::Error;
  9. use std::process;
  10. use std::os::unix::fs::PermissionsExt;
  11. use libc::{S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR, S_IXGRP, S_IXOTH, S_IXUSR};
  12.  
  13. use structopt::StructOpt;
  14. use chrono::{DateTime, Local};
  15.  
  16. #[derive(StructOpt, Debug)]
  17. struct Opt {
  18. /// Output file
  19. #[structopt(default_value = ".", parse(from_os_str))]
  20. path: PathBuf,
  21. }
  22.  
  23. fn parse_permissions(mode: u16) -> String {
  24. let user = triplet(mode, S_IRUSR, S_IWUSR, S_IXUSR);
  25. let group = triplet(mode, S_IRGRP, S_IWGRP, S_IXGRP);
  26. let other = triplet(mode, S_IROTH, S_IWOTH, S_IXOTH);
  27. [user, group, other].join("")
  28. }
  29.  
  30. fn triplet(mode: u16, read: u16, write: u16, execute: u16) -> String {
  31. match (mode & read, mode & write, mode & execute) {
  32. (0, 0, 0) => "---",
  33. (_, 0, 0) => "r--",
  34. (0, _, 0) => "-w-",
  35. (0, 0, _) => "--x",
  36. (_, 0, _) => "r-x",
  37. (_, _, 0) => "rw-",
  38. (0, _, _) => "-wx",
  39. (_, _, _) => "rwx",
  40. }.to_string()
  41. }
  42.  
  43. fn main() {
  44. let opt = Opt::from_args();
  45. if let Err(ref e) = run(&opt.path) {
  46. println!("{}", e);
  47. process::exit(1);
  48. }
  49. }
  50.  
  51. fn run(dir: &PathBuf) -> Result<(), Box<Error>> {
  52. if dir.is_dir() {
  53. for entry in fs::read_dir(dir)? {
  54. let entry = entry?;
  55. let metadata = entry.metadata()?;
  56. let file_name = entry
  57. .file_name()
  58. .into_string()
  59. .or_else(|f| Err(format!("Invalid entry: {:?}", f)))?;
  60.  
  61. let size = metadata.len();
  62. let modified: DateTime<Local> = DateTime::from(metadata.modified()?);
  63. let mode = metadata.permissions().mode();
  64.  
  65. println!(
  66. "{} {:>5} {} {}",
  67. parse_permissions(mode as u16),
  68. size,
  69. modified.format("%_d %b %H:%M").to_string(),
  70. file_name
  71. );
  72. }
  73. }
  74. Ok(())
  75. }
Add Comment
Please, Sign In to add comment