2020-10-05 10:36:49 +13:00
|
|
|
mod commands;
|
2020-09-30 01:37:50 +13:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
use commands::Commands;
|
2020-08-30 05:11:55 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
#[allow(unused_imports)] // It is used in release for print_results().
|
|
|
|
use czkawka_core::common_traits::*;
|
2020-08-31 00:00:22 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
use czkawka_core::{
|
2020-11-01 07:19:33 +13:00
|
|
|
big_file::{self, BigFile},
|
2020-10-05 10:36:49 +13:00
|
|
|
duplicate::DuplicateFinder,
|
|
|
|
empty_files::{self, EmptyFiles},
|
|
|
|
empty_folder::EmptyFolder,
|
2020-11-03 09:56:07 +13:00
|
|
|
same_music::SameMusic,
|
2020-11-08 04:26:40 +13:00
|
|
|
similar_images::SimilarImages,
|
2020-10-05 10:36:49 +13:00
|
|
|
temporary::{self, Temporary},
|
2020-10-31 22:29:11 +13:00
|
|
|
zeroed::{self, ZeroedFiles},
|
2020-10-05 10:36:49 +13:00
|
|
|
};
|
|
|
|
use std::{path::PathBuf, process};
|
|
|
|
use structopt::StructOpt;
|
|
|
|
|
|
|
|
fn path_list_to_str(path_list: Vec<PathBuf>) -> String {
|
|
|
|
let path_list: Vec<String> = path_list.into_iter().filter_map(|a| a.into_os_string().into_string().ok()).collect();
|
|
|
|
path_list.join(",")
|
|
|
|
}
|
2020-08-31 00:00:22 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
fn main() {
|
|
|
|
let command = Commands::from_args();
|
2020-08-30 05:11:55 +12:00
|
|
|
|
2020-09-18 17:32:37 +12:00
|
|
|
#[cfg(debug_assertions)]
|
2020-10-05 10:36:49 +13:00
|
|
|
println!("{:?}", command);
|
|
|
|
|
|
|
|
match command {
|
|
|
|
Commands::Duplicates {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
2020-10-15 08:10:27 +13:00
|
|
|
minimal_file_size,
|
2020-10-05 10:36:49 +13:00
|
|
|
allowed_extensions,
|
|
|
|
search_method,
|
|
|
|
delete_method,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
|
|
|
} => {
|
|
|
|
let mut df = DuplicateFinder::new();
|
|
|
|
|
|
|
|
df.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
df.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
df.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
2020-10-15 08:10:27 +13:00
|
|
|
df.set_minimal_file_size(minimal_file_size);
|
2020-10-05 10:36:49 +13:00
|
|
|
df.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
|
|
|
|
df.set_check_method(search_method);
|
|
|
|
df.set_delete_method(delete_method);
|
|
|
|
df.set_recursive_search(!not_recursive.not_recursive);
|
2020-09-01 02:15:56 +12:00
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
df.find_duplicates(None, None);
|
2020-09-12 01:52:06 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !df.save_results_to_file(file_name) {
|
2020-09-18 20:23:49 +12:00
|
|
|
df.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
2020-09-16 05:17:13 +12:00
|
|
|
}
|
|
|
|
|
2020-09-19 18:20:49 +12:00
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
2020-09-27 03:52:13 +13:00
|
|
|
df.print_results();
|
2020-09-18 20:23:49 +12:00
|
|
|
df.get_text_messages().print_messages();
|
2020-09-01 05:37:30 +12:00
|
|
|
}
|
2020-11-01 07:19:33 +13:00
|
|
|
Commands::EmptyFolders {
|
|
|
|
directories,
|
|
|
|
delete_folders,
|
|
|
|
file_to_save,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
} => {
|
2020-10-05 10:36:49 +13:00
|
|
|
let mut ef = EmptyFolder::new();
|
2020-09-18 21:11:08 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
ef.set_included_directory(path_list_to_str(directories.directories));
|
2020-11-01 07:19:33 +13:00
|
|
|
ef.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
ef.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
2020-10-05 10:36:49 +13:00
|
|
|
ef.set_delete_folder(delete_folders);
|
2020-09-18 21:11:08 +12:00
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
ef.find_empty_folders(None, None);
|
2020-09-18 21:11:08 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !ef.save_results_to_file(file_name) {
|
2020-09-18 20:23:49 +12:00
|
|
|
ef.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
2020-09-01 05:37:30 +12:00
|
|
|
}
|
2020-09-01 02:26:14 +12:00
|
|
|
|
2020-09-19 18:20:49 +12:00
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
2020-09-27 03:52:13 +13:00
|
|
|
ef.print_results();
|
2020-10-05 10:36:49 +13:00
|
|
|
ef.get_text_messages().print_messages();
|
2020-09-01 05:37:30 +12:00
|
|
|
}
|
2020-10-05 10:36:49 +13:00
|
|
|
Commands::BiggestFiles {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
allowed_extensions,
|
|
|
|
number_of_files,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
2020-11-01 07:19:33 +13:00
|
|
|
delete_files,
|
2020-10-05 10:36:49 +13:00
|
|
|
} => {
|
|
|
|
let mut bf = BigFile::new();
|
|
|
|
|
|
|
|
bf.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
bf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
bf.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
bf.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
|
|
|
|
bf.set_number_of_files_to_check(number_of_files);
|
|
|
|
bf.set_recursive_search(!not_recursive.not_recursive);
|
2020-11-01 07:19:33 +13:00
|
|
|
if delete_files {
|
|
|
|
bf.set_delete_method(big_file::DeleteMethod::Delete);
|
|
|
|
}
|
2020-09-26 23:48:53 +12:00
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
bf.find_big_files(None, None);
|
2020-09-26 23:48:53 +12:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !bf.save_results_to_file(file_name) {
|
2020-09-26 23:48:53 +12:00
|
|
|
bf.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
2020-09-27 03:52:13 +13:00
|
|
|
bf.print_results();
|
2020-09-26 23:48:53 +12:00
|
|
|
bf.get_text_messages().print_messages();
|
|
|
|
}
|
2020-10-05 10:36:49 +13:00
|
|
|
Commands::EmptyFiles {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
allowed_extensions,
|
|
|
|
delete_files,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
|
|
|
} => {
|
|
|
|
let mut ef = EmptyFiles::new();
|
|
|
|
|
|
|
|
ef.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
ef.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
ef.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
ef.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
|
|
|
|
ef.set_recursive_search(!not_recursive.not_recursive);
|
|
|
|
|
|
|
|
if delete_files {
|
|
|
|
ef.set_delete_method(empty_files::DeleteMethod::Delete);
|
|
|
|
}
|
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
ef.find_empty_files(None, None);
|
2020-10-05 10:36:49 +13:00
|
|
|
|
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !ef.save_results_to_file(file_name) {
|
|
|
|
ef.get_text_messages().print_messages();
|
2020-09-27 08:50:16 +13:00
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
2020-10-05 10:36:49 +13:00
|
|
|
ef.print_results();
|
|
|
|
ef.get_text_messages().print_messages();
|
2020-09-27 08:50:16 +13:00
|
|
|
}
|
2020-10-05 10:36:49 +13:00
|
|
|
Commands::Temporary {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
delete_files,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
|
|
|
} => {
|
|
|
|
let mut tf = Temporary::new();
|
|
|
|
|
|
|
|
tf.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
tf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
tf.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
tf.set_recursive_search(!not_recursive.not_recursive);
|
|
|
|
|
|
|
|
if delete_files {
|
2020-09-27 21:31:14 +13:00
|
|
|
tf.set_delete_method(temporary::DeleteMethod::Delete);
|
|
|
|
}
|
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
tf.find_temporary_files(None, None);
|
2020-09-27 21:31:14 +13:00
|
|
|
|
2020-10-05 10:36:49 +13:00
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !tf.save_results_to_file(file_name) {
|
2020-09-27 21:31:14 +13:00
|
|
|
tf.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
|
|
|
tf.print_results();
|
|
|
|
tf.get_text_messages().print_messages();
|
|
|
|
}
|
2020-10-15 08:10:27 +13:00
|
|
|
Commands::SimilarImages {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
file_to_save,
|
|
|
|
minimal_file_size,
|
2020-11-10 00:55:27 +13:00
|
|
|
similarity,
|
2020-10-15 08:10:27 +13:00
|
|
|
not_recursive,
|
|
|
|
} => {
|
|
|
|
let mut sf = SimilarImages::new();
|
|
|
|
|
|
|
|
sf.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
sf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
sf.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
sf.set_minimal_file_size(minimal_file_size);
|
|
|
|
sf.set_recursive_search(!not_recursive.not_recursive);
|
2020-11-10 00:55:27 +13:00
|
|
|
sf.set_similarity(similarity);
|
2020-10-15 08:10:27 +13:00
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
sf.find_similar_images(None, None);
|
2020-10-15 08:10:27 +13:00
|
|
|
|
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !sf.save_results_to_file(file_name) {
|
|
|
|
sf.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
|
|
|
sf.print_results();
|
|
|
|
sf.get_text_messages().print_messages();
|
|
|
|
}
|
2020-10-31 22:29:11 +13:00
|
|
|
Commands::ZeroedFiles {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
allowed_extensions,
|
|
|
|
delete_files,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
|
|
|
minimal_file_size,
|
|
|
|
} => {
|
|
|
|
let mut zf = ZeroedFiles::new();
|
|
|
|
|
|
|
|
zf.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
zf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
zf.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
zf.set_allowed_extensions(allowed_extensions.allowed_extensions.join(","));
|
|
|
|
zf.set_minimal_file_size(minimal_file_size);
|
|
|
|
zf.set_recursive_search(!not_recursive.not_recursive);
|
|
|
|
|
|
|
|
if delete_files {
|
|
|
|
zf.set_delete_method(zeroed::DeleteMethod::Delete);
|
|
|
|
}
|
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
zf.find_zeroed_files(None, None);
|
2020-10-31 22:29:11 +13:00
|
|
|
|
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !zf.save_results_to_file(file_name) {
|
|
|
|
zf.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
|
|
|
zf.print_results();
|
|
|
|
zf.get_text_messages().print_messages();
|
|
|
|
}
|
2020-11-03 09:56:07 +13:00
|
|
|
Commands::SameMusic {
|
|
|
|
directories,
|
|
|
|
excluded_directories,
|
|
|
|
excluded_items,
|
|
|
|
// delete_files,
|
|
|
|
file_to_save,
|
|
|
|
not_recursive,
|
|
|
|
minimal_file_size,
|
|
|
|
music_similarity,
|
|
|
|
} => {
|
|
|
|
let mut mf = SameMusic::new();
|
|
|
|
|
|
|
|
mf.set_included_directory(path_list_to_str(directories.directories));
|
|
|
|
mf.set_excluded_directory(path_list_to_str(excluded_directories.excluded_directories));
|
|
|
|
mf.set_excluded_items(path_list_to_str(excluded_items.excluded_items));
|
|
|
|
mf.set_minimal_file_size(minimal_file_size);
|
|
|
|
mf.set_recursive_search(!not_recursive.not_recursive);
|
|
|
|
mf.set_music_similarity(music_similarity);
|
|
|
|
|
|
|
|
// if delete_files {
|
|
|
|
// // TODO mf.set_delete_method(same_music::DeleteMethod::Delete);
|
|
|
|
// }
|
|
|
|
|
2020-12-02 22:25:27 +13:00
|
|
|
mf.find_same_music(None, None);
|
2020-11-03 09:56:07 +13:00
|
|
|
|
|
|
|
if let Some(file_name) = file_to_save.file_name() {
|
|
|
|
if !mf.save_results_to_file(file_name) {
|
|
|
|
mf.get_text_messages().print_messages();
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(debug_assertions))] // This will show too much probably unnecessary data to debug, comment line only if needed
|
|
|
|
mf.print_results();
|
|
|
|
mf.get_text_messages().print_messages();
|
|
|
|
}
|
2020-10-05 10:36:49 +13:00
|
|
|
}
|
2020-08-26 21:17:16 +12:00
|
|
|
}
|