ã¡ãã£ãšããããã°ã©ã ãæžãå Žåã«ãååž°åŠçã䜿ããšããã°ã©ã ãã·ã³ãã«ã«äœæã§ããå ŽåããããŸãããã®ãããååž°åŠçãèšè¿°ã§ãã人ãšããã§ãªã人ã§ã¯ãããã°ã©ãã³ã°åã«å·®ãã§ããŸããä»åã¯ãååž°ãåãããããçè§£ããäŸãšããŠããã¡ã€ã«æ€çŽ¢ããŒã«ãäœã£ãŠã¿ãŸãããã
ãã¡ã€ã«æ€çŽ¢ããŒã«ãäœãã
ä»åã¯ãååž°æ€çŽ¢ã®äŸãšããŠãã¯ã€ã«ãã«ãŒããå©çšããŠããã¡ã€ã«ãæ€çŽ¢ããã³ãã³ãã©ã€ã³ããŒã«ãäœã£ãŠã¿ãŸããããæåã«ãã«ã¬ã³ããã£ã¬ã¯ããªã«ãããã¡ã€ã«ã®æ€çŽ¢ããŒã«ãäœãããã®åŸã§ãååž°ãå©çšããŠãµããã£ã¬ã¯ããªã®æ€çŽ¢ã«å¯Ÿå¿ããããã«æ¹é ããŠã¿ãŸãããã
ç°¡åãªlsã³ãã³ãã®ãããªãã®ãäœã£ãŠã¿ãã
æåã«ãã«ã¬ã³ããã£ã¬ã¯ããªã«ãããã¡ã€ã«ãæ€çŽ¢ããã³ãã³ãã©ã€ã³ããŒã«ãäœã£ãŠã¿ãŸãããããã£ãããªã®ã§ãlsã³ãã³ãã®ããã«ã¯ã€ã«ãã«ãŒãã䜿ããããã«ããŠã¿ãŸãããã
ã¯ã€ã«ãã«ãŒããå®è£ ããå Žåããååž°åŠçã䜿ããšæ¯èŒçç°¡åã«å®è£ ã§ããã®ã§ãããä»åã¯ãRustã®ã©ã€ãã©ãªãå©çšããããšã«ããŸããRustã§ã¯äŸ¿å©ãªã©ã€ãã©ãªãããããå ¬éãããŠãããcrates.ioã«ã¢ã¯ã»ã¹ããŠæ€çŽ¢ããŠã¿ããšãå€ãã®äŸ¿å©ãªã©ã€ãã©ãªãèŠã€ããããšãã§ããã§ãããã
ãwildcardãããwildcard_exããšããååãã°ããã®ãŸãŸã®ã¯ã¬ãŒãããããŸããä»åã¯ããwildcard_exãã䜿ã£ãŠã¿ãŸããããå®ã¯ããã®ã¯ã¬ãŒããçè ãå æ¥ãæ¬ã³ã©ã ãæžãããšæã£ãŠäœã£ãŠå ¬éãããã®ã§ãããã®ã¯ã¬ãŒãã䜿ããšãæè»œã«ã¯ã€ã«ãã«ãŒãã䜿ã£ããã¡ã€ã«æ€çŽ¢ãå®çŸã§ããŸãã
Rustã§ã¯ã¬ãŒããã€ã³ã¹ããŒã«ããã«ã¯ããcargoããšããã³ãã³ãã䜿ã£ãŠæè»œã«ã€ã³ã¹ããŒã«ã§ããŸããããã¯ãRustã®ãã«ãã·ã¹ãã ã§ãããããã±ãŒãžãããŒãžã£ãŒã§ãã
ã¿ãŒããã«(WindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.app)ãèµ·åããŠã以äžã®ã³ãã³ããå®è¡ããŸãã
# ãããžã§ã¯ãã®ãã£ã¬ã¯ããªãäœæãã
mkdir enum_files
cd enum_files
# ãããžã§ã¯ããåæåããŠãwildcard_exã远å
cargo init
cargo add wildcard_ex
äžèšã³ãã³ããå®è¡ãããšã次ã®ãããªãããžã§ã¯ãã®ã²ãªåœ¢ãçæãããŸãã
âââ Cargo.lock
âââ Cargo.toml
âââ src
  âââ main.rs
ãã¡ã€ã«æ€çŽ¢ã®ããã°ã©ã
ããã§ã¯ãããã°ã©ã ãäœã£ãŠã¿ãŸããããsrc/main.rsãäžèšã®ããã«æžãæããŸããããïŒãªãããã¡ããããã«ãœãŒã¹ã³ãŒããååŸã§ããŸããïŒ
use wildcard_ex::is_match;
fn main() {
// ã³ãã³ãã©ã€ã³åŒæ°ãååŸ --- (*1)
let args: Vec<String> = std::env::args().collect();
// åŒæ°ã1ã€ä»¥äžããããã§ã㯠--- (*2)
if args.len() < 2 {
// åŒæ°ã1ã€ããªãå Žåã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŠçµäº
eprintln!("Usage: {} <æ€çŽ¢ãã¿ãŒã³>", args[0]);
std::process::exit(1);
}
// æ€çŽ¢ãã¿ãŒã³ãååŸ --- (*3)
let pattern = &args[1];
// ã«ã¬ã³ããã£ã¬ã¯ããªã®ãã¡ã€ã«äžèЧãååŸ --- (*4)
let entries = std::fs::read_dir(".").unwrap();
// ãã¡ã€ã«äžèЧã1ã€ãã€åãåºããŠæ€çŽ¢ãã¿ãŒã³ã«ãããããããã§ã㯠--- (*5)
for entry in entries {
let entry = entry.unwrap();
let fname = entry.file_name();
let fname = fname.to_str().unwrap();
if is_match(pattern, fname) { // ã¯ã€ã«ãã«ãŒãã§æ€çŽ¢ --- (*6)
println!("[çºèŠ] {}", fname);
}
}
}
ããã°ã©ã ãå®è¡ããŠã¿ãŸããããæåã«ãRustã®ãœãŒã¹ãã£ã¬ã¯ããªã«ãããCargo.*ãã«ããããããã¡ã€ã«ãæ€çŽ¢ããŠã¿ãŸãããããšããCargo.tomlããšãCargo.lockããšãã2ã€ã®ãã¡ã€ã«ãèŠã€ããŠè¡šç€ºããŸãã
# Rustã®ã³ã³ãã€ã«ãšå®è¡
cargo run "Cargo.*"
åäœã確èªã§ããããããã°ã©ã ã確èªããŠã¿ãŸãããã(ïŒ1)ã§ã¯ã³ãã³ãã©ã€ã³åŒæ°ãååŸããŸãããããŠã(ïŒ2)ã§ã¯åŒæ°ã2ã€æªæºãã©ããããã§ãã¯ããŸããããã§ãargs[0]ã«ã¯å®è¡ãã¡ã€ã«ã®ãã¡ã€ã«ãã¹ãä»£å ¥ãããŠããŸããããã§ãæ€çŽ¢ãã¿ãŒã³ãæå®ãããŠããªãæã«ã¯ãäœ¿ãæ¹ã衚瀺ããŠããã°ã©ã ãçµäºããŸãã
(ïŒ3)ã§ã¯æ€çŽ¢ãã¿ãŒã³ãååŸããŠã(ïŒ4)ã§ã«ã¬ã³ããã£ã¬ã¯ããªã«ãããã¡ã€ã«ã»ãã£ã¬ã¯ããªã®äžèЧãååŸããŸããããããã(ïŒ5)ã§ã¯1ã€1ã€ã®ãšã³ããªã確èªããŠã(ïŒ6)ã§ã¯ã€ã«ãã«ãŒãã®ãã¿ãŒã³ã«ãã¡ã€ã«åããããããã確èªããŠããããããå Žåã«ç»é¢ã«ãã¡ã€ã«åãåºåããŸãã
ã¡ãªã¿ã«ããã¡ã€ã«ãã¯ã€ã«ãã«ãŒãã®ãã¿ãŒã³ã«ããããããã確èªããis_match颿°ã¯æ¬¡ã®ããã«å©çšããŸãããããããã°trueãããããããªããã°falseãè¿ããŸãã
[æžåŒ] is_match颿°
let b = is_match(ãã¿ãŒã³, ãã¡ã€ã«å);
äŸãã°ãäžèšã®ããã«èšè¿°ããŸããassert_eq!ã¯Rustã®ããã°ã©ã ããã¹ãããããã®æšæºãã¯ãã§ãããassert_eq!(å€1, å€2)ãã®ããã«å©çšããŠãå€1ãšå€2ãåãã§ããããšããã¹ãã§ããŸããäžèšã®äŸã§ã¯ã颿°is_matchã®2ã€ã®å©çšäŸãããããtrueãè¿ãããšããã¹ãããŠããŸãã
use wildcard_ex::is_match;
fn main() {
assert_eq!(is_match("*.txt", "abc.txt"), true);
assert_eq!(is_match("test*.txt", "test1234.txt"), true);
}
ååž°çã«æ€çŽ¢ã§ããããã«æ¹è¯ããã
ãããŸã§ã®éšåã§ãåã«ã«ã¬ã³ããã£ã¬ã¯ããªã«ãããã¡ã€ã«ãæ€çŽ¢ããããŒã«ãäœããŸãããæ¬¡ã«ãã³ãã³ãã©ã€ã³åŒæ°ã«ã-rããªãã·ã§ã³ãããã°ããµããã£ã¬ã¯ããªã®äžãå«ããŠæ€çŽ¢ããããã«æ¹è¯ããŠã¿ãŸãããã
ãªããOSã®ãã¡ã€ã«ã·ã¹ãã ã¯ãæšæ§é ã«ãªã£ãŠããŸããã«ãŒããã©ã€ãã®äžã«ãã¡ã€ã«ããã©ã«ã(ãã£ã¬ã¯ããª)ãããããã©ã«ããéããšããã®äžã«ãŸãããã¡ã€ã«ããã©ã«ãããããŸãããã¡ã€ã«ããã©ã«ãã®æ§åãæãæµ®ãã¹ãŠã¿ããšããã©ã«ãã倪ãæã§ãããããããè€æ°ã®çްãæã䌞ã³ãŠããæ§åã«äŒŒãŠããããšã§ããããããããæšæ§é ã®ããŒã¿ãå šãŠæ€æ»ãããå Žåã«ã¯ãååž°ã䜿ãå¿ èŠããããŸãã
ãã®ç¹ãèžãŸããŠãå ã»ã©ã®ãsrc/main.rsãæ¬¡ã®ããã«æžãæããŸããããïŒãã¡ãããããœãŒã¹ã³ãŒããåç §ã§ããŸãïŒ
use wildcard_ex::is_match;
fn main() {
// ã³ãã³ãã©ã€ã³åŒæ°ãååŸ --- (*1)
let args: Vec<String> = std::env::args().collect();
// åŒæ°ã1ã€ä»¥äžããããã§ãã¯
if args.len() < 2 {
// åŒæ°ã1ã€ããªãå Žåã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŠçµäº
eprintln!("Usage: {} [-r] <æ€çŽ¢ãã¿ãŒã³>", args[0]);
std::process::exit(1);
}
// åŒæ°ã« "-r"ãããã°ãååž°çã«æ€çŽ¢ãã --- (*2)
let mut recursive = false;
let pattern = if &args[1] == "-r" {
recursive = true;
&args[2] // ãã¿ãŒã³ãåŸã --- (*3)
} else { &args[1] };
// ãã¿ãŒã³ã«åããã¡ã€ã«äžèЧãååŸ --- (*4)
let files = enum_files(".", pattern, recursive);
for file in files {
println!("[çºèŠ] {}", file);
}
}
// ååž°çã«ãã¡ã€ã«ãåæãã颿° --- (*5)
fn enum_files(dir: &str, pattern: &str, recursive: bool) -> Vec<String> {
let mut files = vec![];
let entries = std::fs::read_dir(dir).unwrap(); // äžèЧãååŸ
for entry in entries {
let entry = entry.unwrap();
let path = entry.path();
if path.is_dir() { // ãã£ã¬ã¯ããªã®å Žå --- (*6)
if recursive { // ååž°çã«æ€çŽ¢
let mut subfiles = enum_files(
&path.to_string_lossy(), pattern, recursive);
files.append(&mut subfiles);
}
continue;
}
// ãã¡ã€ã«åãååŸããŠãã¿ãŒã³ã«ãããããããã§ã㯠--- (*7)
let fname = entry.file_name().to_string_lossy().to_string();
if pattern == "" || is_match(pattern, &fname) {
files.push(entry.path().to_string_lossy().to_string());
}
}
files
}
ããã°ã©ã ããã«ãã«ããã«ã¯ãã¿ãŒããã«ã§äžèšã®ã³ãã³ããå®è¡ããŸãã
cargo build
ãããšãtarget/debugãã£ã¬ã¯ããªã«ããenum_filesã(Windowsã§ã¯ãenum_files.exeã)ãšããå®è¡ãã¡ã€ã«ãäœæãããŸãã
ããã§ãã¿ãŒããã«ã§ã以äžã®ããã«èšè¿°ãããšãã«ã¬ã³ããã£ã¬ã¯ããªä»¥äžã«ãããæ¡åŒµåãã.rsãã®ãã¡ã€ã«ãåæããŸãã
# Windowsã®å Žå
.\target\debug\enum_files.exe -r "*.rs"
# macOSã®å Žå
./target/debug/enum_files -r "*.rs"
ååž°ãå©çšããŠããéšåã«æ³šç®ãã€ã€ãããã°ã©ã ã確èªããŠã¿ãŸãããã
(ïŒ1)ã§ã¯ã³ãã³ãã©ã€ã³åŒæ°ãååŸããŸãã(ïŒ2)ã§ã¯ååž°åŠçãè¡ãããšãæå®ãããªãã·ã§ã³ã§ããã-rããåŒæ°ã«ãããã©ããã確èªããŸãã(ïŒ3)ã§ã¯ã-rãããããšãã«ãã¿ãŒã³ãååŸããŸãã(ïŒ4)ã§ã¯ãã¿ãŒã³ã«åããã¡ã€ã«äžèЧãååŸããŸãã
(ïŒ5)ã«ãŠãååž°ãå©çšããŠããã¿ãŒã³ã«åããã¡ã€ã«äžèЧãåæãã颿°enum_filesãå®çŸ©ããŸããread_dirã¡ãœããã䜿ã£ãŠãã¡ã€ã«ããã£ã¬ã¯ããªãåæããŠããã£ã¬ã¯ããªã§ããã°ã(ïŒ6)ã§ååž°çã«ãµããã£ã¬ã¯ããªãååž°æ€çŽ¢ããŸãã颿°enum_filesã®äžã§ãenum_filesãåŒã³åºããŠããããããååž°åŠçã§ãã(ïŒ7)ã§ã¯ã¯ã€ã«ãã«ãŒãã®ãã¿ãŒã³ã«ãã¡ã€ã«åãããããããã確èªããŠããããããã°æ»ãå€ã«å«ããŸãã
ãŸãšã
以äžãä»åã¯ãååž°çã«ãã¡ã€ã«æ€çŽ¢ãè¡ãã³ãã³ãã©ã€ã³ããŒã«ãäœã£ãŠã¿ãŸãããååž°çã«ãã¡ã€ã«æ€çŽ¢ãè¡ãã«ã¯ããã¡ã€ã«åæãè¡ã颿°enumfilesãå®çŸ©ããŠãããŠããµããã©ã«ããèŠã€ããæã«ããµããã©ã«ãã®ãã¹ãæå®ããŠé¢æ°enumfilesãåŒã³åºãã°è¯ãã®ã§ããããã®ãããªååž°åŠçã䜿ãäºã§ãã¯ã€ã«ãã«ãŒããå®è£ ããããã°ã©ã ãèšè¿°ã§ããŸããæ¬¡åã¯ãRustã§ã¯ã€ã«ãã«ãŒããå®è£ ããããã°ã©ã ãäœã£ãŠã¿ãŸãããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠãããçŽè¿ã§ã¯ããå®è·µåãã¢ãããã Pythonã«ããã¢ã«ãŽãªãºã ã®æç§æž(ãã€ããåºç)ããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããããã«äœ¿ãã!æ¥åã§å®è·µã§ãã! Pythonã«ããAIã»æ©æ¢°åŠç¿ã»æ·±å±€åŠç¿ã¢ããªã®ã€ããæ¹ TensorFlow2察å¿(ãœã·ã )ãããã³ã¬ã§ãã£ããåŠã¶Python(ãã€ããåºç)ããªã©ã




