Portál AbcLinuxu, 17. prosince 2025 05:57
rm aby smazal jenom [A-Z] soubory?
..omlouvám se, je to stupidní ale nic mě nenapadá, tj. ani pod čím bych to našel... (Když nic tak aspoň script, please ;) )
rm $(ls | egrep '^[A-Z]+$')
rm: too few arguments
Try `rm --help' for more information.
je přesně to co to vrátí. Jinak soubory mají tvar XXX.xxx až XXX~1.xxx, typická ošklivá DOS jména...
rm "$(ls |egrep '^[A-Z]+.h3m')"
a vrátilo mi to:
cannot remove \nXXX.h3m
Takže už zbývá jenom odtázka jak převést \n na mezeru?
man sed
/n nebo ho opravit v následujícím příkazu budu ti jen vděčný.
rm "$(ls | egrep '^[A-Z][A-Z]+.h3m')"
..operace je prováděna na FAT32 disku
..dotaz jsem dodatečně upřesnil
ls hodí na jeden řádek víc jmen a s tím se (e)grep neporadí...
for i in *; do
if [ "$(echo $i | egrep '^[A-Z ]+$')" ]; then
rm "$i"
fi
done
DOS 8.3 name, tudíž i s mezerami
~ a číslo/a
[A-Z,.-_ ], všechny znaky povolené znaky v DOSu si už prostě nepamatuju.
hynek[~]$ echo a | egrep '[A-Z]' a hynek[~]$
echo a | egrep '[A-Z]*'? To by bylo v pořádku.
echo a není vůbec žádný znak z ropzsahu [A-Z]. Mě se ta úloha nedaří vyřešit jinak, než grep -v '[a-z]'. Můj grep i bash si prostě myslí, že když napíšu [A-Z], měl jsem patrně na mysli [a-zA-Z] a asi jsem byl jen línej.
[e]grep a bash poněkud nas... echo a | perl -ne 'm/[A-Z]/ && print'
"Many locales sort characters in dictionary order, and in these locales [a-d] is typically not equivalent to [abcd]; it might be equivalent to [aBbCcDd], for example. To obtain the traditional interpretation of bracket expressions, you can use the C locale by setting the LC_ALL environment variable to the value C."
Takže následující funguje podle očekávání:
dunric@darkstar:~$ echo a | LC_ALL=C grep '[A-Z]'
dunric@darkstar:~$
dunric@darkstar:~$ echo A | LC_ALL=C grep '[A-Z]'
A
dunric@darkstar:~$
$ locale LANG=cs_CZ.UTF-8 LC_CTYPE="cs_CZ.UTF-8" LC_NUMERIC="cs_CZ.UTF-8" LC_TIME="cs_CZ.UTF-8" LC_COLLATE=C LC_MONETARY="cs_CZ.UTF-8" LC_MESSAGES="cs_CZ.UTF-8" LC_PAPER="cs_CZ.UTF-8" LC_NAME="cs_CZ.UTF-8" LC_ADDRESS="cs_CZ.UTF-8" LC_TELEPHONE="cs_CZ.UTF-8" LC_MEASUREMENT="cs_CZ.UTF-8" LC_IDENTIFICATION="cs_CZ.UTF-8" LC_ALL= $ grep '[á-é]' Neoprávněný přístup do paměti (SIGSEGV)
Zkusím se na to někdy o víkendu kouknout...
grep namá, jak se zdá, regexp připravený na unicode.
Within a bracket expression, a range expression consists of two charac-
ters separated by a hyphen. It matches any single character that sorts
between the two characters, inclusive, using the locale's collating
sequence and character set. For example, in the default C locale,
[a-d] is equivalent to [abcd]. Many locales sort characters in dictio-
nary order, and in these locales [a-d] is typically not equivalent to
[abcd]; it might be equivalent to [aBbCcDd], for example. To obtain
the traditional interpretation of bracket expressions, you can use the
C locale by setting the LC_ALL environment variable to the value C.
To je ale záludnost
hynek[~]$ LC_ALL=C hynek[~]$ echo a | egrep '[A-Z]' hynek[~]$Řešením je samozřejmě použít i [:upper:]. Funguje to například i v
rm [[:upper:]]*případně
find -name '[[:upper:]]*' -print0 | xargs -0 rm(Maže soubory začínající na velké písmeno)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.