@@ -115,6 +115,10 @@ struct Args {
115115 #[ arg( short = 's' , long = "skip-large" ) ]
116116 max_size_mb : Option < u64 > ,
117117
118+ /// Show file sizes
119+ #[ arg( short = 'z' , long = "size" ) ]
120+ show_size : bool ,
121+
118122 /// Starting directory
119123 #[ arg( default_value = "." ) ]
120124 path : PathBuf ,
@@ -143,6 +147,7 @@ struct StructConfig {
143147 custom_ignores : Vec < Regex > ,
144148 max_size_bytes : Option < u64 > ,
145149 git_files : Option < HashSet < PathBuf > > ,
150+ show_size : bool ,
146151}
147152
148153fn main ( ) {
@@ -215,6 +220,7 @@ fn main() {
215220 custom_ignores,
216221 max_size_bytes,
217222 git_files,
223+ show_size : args. show_size ,
218224 } ;
219225
220226 println ! ( "{}" , args. path. display( ) . to_string( ) . cyan( ) ) ;
@@ -280,6 +286,22 @@ fn get_dir_size(path: &Path) -> u64 {
280286 . sum ( )
281287}
282288
289+ fn format_size ( bytes : u64 ) -> String {
290+ const KB : u64 = 1024 ;
291+ const MB : u64 = KB * 1024 ;
292+ const GB : u64 = MB * 1024 ;
293+
294+ if bytes >= GB {
295+ format ! ( "{:.1}G" , bytes as f64 / GB as f64 )
296+ } else if bytes >= MB {
297+ format ! ( "{:.1}M" , bytes as f64 / MB as f64 )
298+ } else if bytes >= KB {
299+ format ! ( "{:.1}K" , bytes as f64 / KB as f64 )
300+ } else {
301+ format ! ( "{}B" , bytes)
302+ }
303+ }
304+
283305fn display_tree (
284306 path : & Path ,
285307 config : & StructConfig ,
@@ -323,8 +345,16 @@ fn display_tree(
323345
324346 let connector = if is_last_entry { "└── " } else { "├── " } ;
325347 let dir_name = format ! ( "{}/" , name) . blue ( ) . bold ( ) ;
326- let count_msg = format ! ( " ({} files ignored)" , ignored_count) . bright_black ( ) ;
327- println ! ( "{}{}{}{}" , prefix, connector, dir_name, count_msg) ;
348+
349+ if config. show_size {
350+ let size = get_dir_size ( & path) ;
351+ let size_str = format_size ( size) ;
352+ let count_msg = format ! ( " ({}, {} files ignored)" , size_str, ignored_count) . bright_black ( ) ;
353+ println ! ( "{}{}{}{}" , prefix, connector, dir_name, count_msg) ;
354+ } else {
355+ let count_msg = format ! ( " ({} files ignored)" , ignored_count) . bright_black ( ) ;
356+ println ! ( "{}{}{}{}" , prefix, connector, dir_name, count_msg) ;
357+ }
328358 continue ;
329359 }
330360
@@ -370,7 +400,21 @@ fn display_tree(
370400 name. normal ( )
371401 } ;
372402
373- println ! ( "{}{}{}" , prefix, connector, display_name) ;
403+ // Add size if requested
404+ if config. show_size {
405+ if is_dir {
406+ println ! ( "{}{}{}" , prefix, connector, display_name) ;
407+ } else {
408+ if let Ok ( metadata) = fs:: metadata ( & path) {
409+ let size_str = format ! ( " ({})" , format_size( metadata. len( ) ) ) . bright_black ( ) ;
410+ println ! ( "{}{}{}{}" , prefix, connector, display_name, size_str) ;
411+ } else {
412+ println ! ( "{}{}{}" , prefix, connector, display_name) ;
413+ }
414+ }
415+ } else {
416+ println ! ( "{}{}{}" , prefix, connector, display_name) ;
417+ }
374418
375419 // Recurse into directories
376420 if is_dir {
0 commit comments