Portál AbcLinuxu, 30. dubna 2025 18:09
Tak mám ve sém ~/bin
další skript, bez kterého jsem jak bez ruky.
Čas od času je potřeba najít soubor, k tomu slouží příkaz find
. Pro mě byl tento příkaz vždy trochu nešťastný, protože je příliš mocný a skoro nikdy jsem tam ty parametry napoprvé nenaskládal ve správném pořadí. Vyřešil jsem si to skriptem, který jsem nazval sifi
- simple find (i když si stejně pokaždé vzpomenu na syfilis; aspoň se to líp pamatuje). Skript je triviální:
#!/bin/sh find . -name "$1"
Používám ho dost často při programování v Javě. Typicky vím, jak se nějaká třída jmenuje, ale nevím jak hluboko je pohřbená v balících:
svn revert `sifi PohřbenáTřída.java`
Když mí po přepínání větví začne zlobit pythoní aplikace, dost často to vyřeší
rm `sifi '*.pyc'`
Tiskni
Sdílej:
mkcd() { mkdir -p "$1" && cd "$1"; }
. Jinak mám raději samostatné soubory, které můžu kopírovat, poslat, zálohovat...
Proto pouzivam zsh, pro dane priklady to vypadalo:
svn revert **/ZakopanaTrida.java
rm **/*.pyc
(pro zsh musi byt zapnuta option extendedglob, neco jako "setopt extendedglob" v ~/.zshrc). Plus zsh ma uzasny autocomplete (doplnuje treba i remote adresare/fajly ze svn nebo ssh, kdyz pisu "scp asdf.txt stroj_nekde:dir1/dir2")
Pro skripty porad pouzivam bash (kvuli prenositelnosti). Ale jako interaktivni shell je zsh hodne pohodlne, globbing zsh je brutalne silnej (vsechny moznosti nezna snad ani autor sam ), napr:
ls -l (#i)**/*nejaka*~*jina*(.)
vylistuje vsechny soubory libovolne hluboko '**', case insensitive '(#i)', ktere zaroven nematchujou '*jina*' a jsou obycejnym souborem '(.)'. Vetsinou takhle "silene" globy nepotrebuju, nekdy se to presto hodi. IMHO zsh-completion se mi zda taky lepsi nez bash-completion.
Nekdy se taky hodi zmv - hromadny prejmenovani souboru, podporuje stejny globbing a capture groups (jako zavorky u regexpu).
BTW sample zshrc kdyby to chtel nekdo zkusit.
Používám něco obdobného, ale navíc i pro prohledávání souborů podle obsahu. (Plus přidávám pár dalších drobností.)
# Hledani souboru podle jmena. # (Pouziti: find-name /nejaky/adresar/ 'soubor*.txt') find-name () { local dir=$1 local name=$2 shift 2 find "$dir" -name "$name" $* } # Hledani souboru podle obsahu. # (Pouziti: find-content /nejaky/adresar/ 'hledany retezec') find-content () { local dir=$1 local content=$2 shift 2 find "$dir" -type f -exec grep -il -- "$content" {} \; $* } # Porovnavani rozdilu mezi soubory/adresari bez vypisu podrobnosti. # (Pouziti: ddiff /nejaky/adresar/ /nejaky/jiny/adresar/) alias ddiff='diff --brief' # Vypis absolutni cesty k souboru/adresari, volitelne i s kvalifikovanym # domenovym jmenem ve tvaru prijimanem programem scp. # (Pouziti: pt /nejaky/soubor/nebo/adresar # fpt /nejaky/soubor/nebo/adresar) pt () { echo `readlink -f "$*"` } fpt () { echo `hostname -f`:`pt "$*"` } # Vytvoreni adresare s okamzitym vstoupenim do nej. # (Pouziti: mkdir-cd novy-adresar) mkdir-cd () { mkdir $* && shift $[$#-1] && cd $1 }
Skript je pěkný, na příkazové řádce se může hodit, ale…
Typicky vím, jak se nějaká třída jmenuje, ale nevím jak hluboko je pohřbená v balících
…nechceš zkusít nějaké IDE? Např. v Netbeans zmáčknu
Ctrl+O
a začnu psát název třídy – hledá se nejen v aktuálním projektu, ale i v knihovnách a v JRE. Pak jen stačí zmáčknout enter
a jsi přímo v té třídě. Podpora (nejen) SVN tam taky je.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.