ls: add more informative listing with -l (WIP)

This commit is contained in:
g1n 2021-07-24 07:29:01 +00:00
parent 6036135bab
commit 06f1268506
3 changed files with 46 additions and 5 deletions

5
Makefile Normal file
View File

@ -0,0 +1,5 @@
PREFIX ?= ~/.local/bin/grutils
file_list != find . -name '*.rs'
all:
rust

BIN
ls Executable file

Binary file not shown.

View File

@ -1,11 +1,20 @@
use std::env; use std::env;
use std::fs; use std::fs;
use std::io::{stdout, Write};
use std::path::Path;
use std::os::unix::fs::PermissionsExt;
/*extern crate chrono;
use chrono::prelude::*;*/
fn main(){ fn main(){
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
let pwd = env::current_dir().unwrap(); // Flags vars
let mut show_hidden = false; let mut show_hidden = false;
let mut show_prev_and_current = false; let mut show_prev_and_current = false;
let mut long_listing = false;
// Directories
let pwd = env::current_dir().unwrap();
let mut dir = pwd.to_str(); let mut dir = pwd.to_str();
for arg in 1..args.len() { for arg in 1..args.len() {
match args[arg].as_str() { match args[arg].as_str() {
@ -19,15 +28,18 @@ fn main(){
"-A" | "--almost-all" => { "-A" | "--almost-all" => {
show_hidden = true; show_hidden = true;
show_prev_and_current = false; show_prev_and_current = false;
} },
"-l" => {
long_listing = true;
},
arg => { arg => {
dir = Some(arg); dir = Some(arg);
}, },
} }
} }
list_dir(dir.unwrap().to_string(), show_hidden, show_prev_and_current); list_dir(dir.unwrap().to_string(), show_hidden, show_prev_and_current, long_listing);
} }
fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool) { fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool, long_listing: bool) {
let files = fs::read_dir(arg.clone()).unwrap(); let files = fs::read_dir(arg.clone()).unwrap();
if show_hidden && show_prev_and_current { if show_hidden && show_prev_and_current {
println!("."); println!(".");
@ -39,6 +51,30 @@ fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool) {
if file.clone().unwrap().display().to_string().starts_with('.') && !show_hidden { if file.clone().unwrap().display().to_string().starts_with('.') && !show_hidden {
continue; continue;
} }
println!("{}", file.unwrap().display()); if long_listing {
long_listing_format(Path::new(&path), file.unwrap().display().to_string());
} else {
print!("{} ", file.unwrap().display());
}
} }
if !long_listing {
print!("\n");
}
stdout().flush().unwrap();
}
fn long_listing_format(path: &Path, file: String) -> std::io::Result<()> {
let metadata = fs::metadata(path)?;
let modified = metadata.modified();
/*let timestamp = modified.parse::<i64>().unwrap();
let naive = NaiveDateTime::fromtimestamp(timestamp, 0);
let datetime: DateTime<Utc> = DateTime::from_utc(naive, Utc);*/
let mut permissions_string = String::new();
if metadata.is_dir() {
permissions_string.push('d');
} else {
permissions_string.push('-');
}
println!("{}{:o} {} {}", permissions_string, metadata.permissions().mode(), metadata.len(), file);
Ok(())
} }