Portál AbcLinuxu, 19. prosince 2025 13:15
Protože se mi často stává, že si při mazání více souborů omylem vymažu celý obsah adresáře, protože se mi do zápisu připlete *, rozhodnul jsem se, že si napíšu takový malý wrapper pro rm -fr v C.
Už ho mám skoro hotový, ale mám jeden problém. Když jsem ho spustil, tak jsem zjistil, že Bash do toho příkazu předává už přímo expandovanou *
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i, opt;
for(i=1;i<argc;i++) {
if (strcasecmp(argv[i],"*")==0) {
printf("Opravdu chcete vymazat vsechny soubory v tomto adresari? (A/N)");
opt=getchar();
if (opt=='N') {
exit(1);
} else if (opt=='A') {
break;
}
}
}
argv[0]="rm";
execvp("rm", argv);
exit(0);
}
A proto mi nefunguje zvýrazněný řádek strcasecmp. Jde to nějak obejít?
Tiskni
Sdílej:
Zrovna jsem chtěl napsat, že v zsh stačí nenastavit RM_STAR_SILENT.
int i, opt;
moc nechápu, opt je integer (A/N má nějaké číslo?, nějak to nesedí)?
... jsou v C taky typu int.A jinde mají typ třeba char, ale lze je v pohodě "převést na čísla".
char je taky číslo, co jiného by to bylo.
int a na běžných platformách má také typicky jinou velikost.
#include <stdio.h>
int main()
{
printf("sizeof('a') je %d\n", sizeof('a'));
if (__builtin_types_compatible_p(typeof('a'), int))
printf("'a' je typu int\n");
if (__builtin_types_compatible_p(typeof('a'), char))
printf("'a' je typu char\n");
return 0;
}
Výsledek:
sizeof('a') je 4
'a' je typu int
Ale napadlo mě ještě jiné "řešení". alias myrm="touch neco; srm", kde neco bude nějaká nejlépe exotická věc - např. jeden znak, který by nikoho nenapadlo dát do názvu souboru, ale být v něm může. srm se pak podívá, jestli má na vstupu neco, když jo, tak jeden z parametrů byl *, ?*, *? (což je obojí to samé jako *), ?, nic jiného mě teď nenapadá. neco samozřejmě vždycky smaže.
ten touch by se musel pustit samostatně před mazáním
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.