mirror of
https://github.com/nushell/nushell.git
synced 2024-11-22 00:13:21 +01:00
add -l flag to du
This commit is contained in:
parent
e63976df7e
commit
4f5527bd09
@ -15,6 +15,7 @@ pub struct DuArgs {
|
||||
path: Option<Spanned<NuGlob>>,
|
||||
all: bool,
|
||||
deref: bool,
|
||||
long: bool,
|
||||
exclude: Option<Spanned<NuGlob>>,
|
||||
#[serde(rename = "max-depth")]
|
||||
max_depth: Option<Spanned<i64>>,
|
||||
@ -50,6 +51,11 @@ impl Command for Du {
|
||||
"Dereference symlinks to their targets for size",
|
||||
Some('r'),
|
||||
)
|
||||
.switch(
|
||||
"long",
|
||||
"Get underlying directories and files for each entry",
|
||||
Some('l'),
|
||||
)
|
||||
.named(
|
||||
"exclude",
|
||||
SyntaxShape::GlobPattern,
|
||||
@ -97,6 +103,7 @@ impl Command for Du {
|
||||
}
|
||||
let all = call.has_flag(engine_state, stack, "all")?;
|
||||
let deref = call.has_flag(engine_state, stack, "deref")?;
|
||||
let long = call.has_flag(engine_state, stack, "long")?;
|
||||
let exclude = call.get_flag(engine_state, stack, "exclude")?;
|
||||
#[allow(deprecated)]
|
||||
let current_dir = current_dir(engine_state, stack)?;
|
||||
@ -114,6 +121,7 @@ impl Command for Du {
|
||||
path: None,
|
||||
all,
|
||||
deref,
|
||||
long,
|
||||
exclude,
|
||||
max_depth,
|
||||
min_size,
|
||||
@ -130,6 +138,7 @@ impl Command for Du {
|
||||
path: Some(p),
|
||||
all,
|
||||
deref,
|
||||
long,
|
||||
exclude: exclude.clone(),
|
||||
max_depth,
|
||||
min_size,
|
||||
@ -200,6 +209,7 @@ fn du_for_one_pattern(
|
||||
|
||||
let all = args.all;
|
||||
let deref = args.deref;
|
||||
let long = args.long;
|
||||
let max_depth = args.max_depth.map(|f| f.item as u64);
|
||||
let min_size = args.min_size.map(|f| f.item as u64);
|
||||
|
||||
@ -209,6 +219,7 @@ fn du_for_one_pattern(
|
||||
deref,
|
||||
exclude,
|
||||
all,
|
||||
long,
|
||||
};
|
||||
|
||||
let mut output: Vec<Value> = vec![];
|
||||
@ -217,7 +228,7 @@ fn du_for_one_pattern(
|
||||
Ok(a) => {
|
||||
if a.is_dir() {
|
||||
output.push(DirInfo::new(a, ¶ms, max_depth, span, signals)?.into());
|
||||
} else if let Ok(v) = FileInfo::new(a, deref, span) {
|
||||
} else if let Ok(v) = FileInfo::new(a, deref, span, params.long) {
|
||||
output.push(v.into());
|
||||
}
|
||||
}
|
||||
|
@ -666,7 +666,7 @@ pub(crate) fn dir_entry_dict(
|
||||
|
||||
if md.is_dir() {
|
||||
if du {
|
||||
let params = DirBuilder::new(Span::new(0, 2), None, false, None, false);
|
||||
let params = DirBuilder::new(Span::new(0, 2), None, false, None, false, false);
|
||||
let dir_size = DirInfo::new(filename, ¶ms, None, span, signals)?.get_size();
|
||||
|
||||
Value::filesize(dir_size as i64, span)
|
||||
|
@ -10,6 +10,7 @@ pub struct DirBuilder {
|
||||
pub deref: bool,
|
||||
pub exclude: Option<Pattern>,
|
||||
pub all: bool,
|
||||
pub long: bool,
|
||||
}
|
||||
|
||||
impl DirBuilder {
|
||||
@ -19,6 +20,7 @@ impl DirBuilder {
|
||||
deref: bool,
|
||||
exclude: Option<Pattern>,
|
||||
all: bool,
|
||||
long: bool,
|
||||
) -> DirBuilder {
|
||||
DirBuilder {
|
||||
tag,
|
||||
@ -26,6 +28,7 @@ impl DirBuilder {
|
||||
deref,
|
||||
exclude,
|
||||
all,
|
||||
long,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -39,6 +42,7 @@ pub struct DirInfo {
|
||||
blocks: u64,
|
||||
path: PathBuf,
|
||||
tag: Span,
|
||||
long: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
@ -47,10 +51,16 @@ pub struct FileInfo {
|
||||
size: u64,
|
||||
blocks: Option<u64>,
|
||||
tag: Span,
|
||||
long: bool,
|
||||
}
|
||||
|
||||
impl FileInfo {
|
||||
pub fn new(path: impl Into<PathBuf>, deref: bool, tag: Span) -> Result<Self, ShellError> {
|
||||
pub fn new(
|
||||
path: impl Into<PathBuf>,
|
||||
deref: bool,
|
||||
tag: Span,
|
||||
long: bool,
|
||||
) -> Result<Self, ShellError> {
|
||||
let path = path.into();
|
||||
let m = if deref {
|
||||
std::fs::metadata(&path)
|
||||
@ -67,6 +77,7 @@ impl FileInfo {
|
||||
blocks: block_size,
|
||||
size: d.len(),
|
||||
tag,
|
||||
long,
|
||||
})
|
||||
}
|
||||
Err(e) => Err(e.into()),
|
||||
@ -92,6 +103,7 @@ impl DirInfo {
|
||||
blocks: 0,
|
||||
tag: params.tag,
|
||||
path,
|
||||
long: params.long,
|
||||
};
|
||||
|
||||
match std::fs::metadata(&s.path) {
|
||||
@ -154,7 +166,7 @@ impl DirInfo {
|
||||
.as_ref()
|
||||
.map_or(true, |x| !x.matches_path(&f));
|
||||
if include {
|
||||
match FileInfo::new(f, params.deref, self.tag) {
|
||||
match FileInfo::new(f, params.deref, self.tag, self.long) {
|
||||
Ok(file) => {
|
||||
let inc = params.min.map_or(true, |s| file.size >= s);
|
||||
if inc {
|
||||
@ -197,16 +209,27 @@ impl From<DirInfo> for Value {
|
||||
// })
|
||||
// }
|
||||
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(d.path.display().to_string(), d.tag),
|
||||
"apparent" => Value::filesize(d.size as i64, d.tag),
|
||||
"physical" => Value::filesize(d.blocks as i64, d.tag),
|
||||
"directories" => value_from_vec(d.dirs, d.tag),
|
||||
"files" => value_from_vec(d.files, d.tag)
|
||||
},
|
||||
d.tag,
|
||||
)
|
||||
if d.long {
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(d.path.display().to_string(), d.tag),
|
||||
"apparent" => Value::filesize(d.size as i64, d.tag),
|
||||
"physical" => Value::filesize(d.blocks as i64, d.tag),
|
||||
"directories" => value_from_vec(d.dirs, d.tag),
|
||||
"files" => value_from_vec(d.files, d.tag)
|
||||
},
|
||||
d.tag,
|
||||
)
|
||||
} else {
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(d.path.display().to_string(), d.tag),
|
||||
"apparent" => Value::filesize(d.size as i64, d.tag),
|
||||
"physical" => Value::filesize(d.blocks as i64, d.tag),
|
||||
},
|
||||
d.tag,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -215,16 +238,27 @@ impl From<FileInfo> for Value {
|
||||
// cols.push("errors".into());
|
||||
// vals.push(Value::nothing(Span::unknown()));
|
||||
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(f.path.display().to_string(), f.tag),
|
||||
"apparent" => Value::filesize(f.size as i64, f.tag),
|
||||
"physical" => Value::filesize(f.blocks.unwrap_or(0) as i64, f.tag),
|
||||
"directories" => Value::nothing(Span::unknown()),
|
||||
"files" => Value::nothing(Span::unknown()),
|
||||
},
|
||||
f.tag,
|
||||
)
|
||||
if f.long {
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(f.path.display().to_string(), f.tag),
|
||||
"apparent" => Value::filesize(f.size as i64, f.tag),
|
||||
"physical" => Value::filesize(f.blocks.unwrap_or(0) as i64, f.tag),
|
||||
"directories" => Value::nothing(Span::unknown()),
|
||||
"files" => Value::nothing(Span::unknown()),
|
||||
},
|
||||
f.tag,
|
||||
)
|
||||
} else {
|
||||
Value::record(
|
||||
record! {
|
||||
"path" => Value::string(f.path.display().to_string(), f.tag),
|
||||
"apparent" => Value::filesize(f.size as i64, f.tag),
|
||||
"physical" => Value::filesize(f.blocks.unwrap_or(0) as i64, f.tag),
|
||||
},
|
||||
f.tag,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,3 +100,17 @@ fn du_with_multiple_path() {
|
||||
let actual = nu!(cwd: "tests/fixtures", "du ...[] | length");
|
||||
assert_eq!(actual.out, "0");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_du_output_columns() {
|
||||
let actual = nu!(
|
||||
cwd: "tests/fixtures/formats",
|
||||
"du -m 1 | columns | str join ','"
|
||||
);
|
||||
assert_eq!(actual.out, "path,apparent,physical");
|
||||
let actual = nu!(
|
||||
cwd: "tests/fixtures/formats",
|
||||
"du -m 1 -l | columns | str join ','"
|
||||
);
|
||||
assert_eq!(actual.out, "path,apparent,physical,directories,files");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user