Preklad ? na X
Pavel Kankovsky
peak na argo.troja.mff.cuni.cz
Pondělí Červenec 2 12:49:53 CEST 2001
On Sat, 30 Jun 2001, Antonin Koci wrote:
> potreboval bych poradit s prekladem ? na X. Jedna se o windows
> soubory, ktere s ? nejdou zkopirovat. Zkousel jsem find -name '*?*'
> -exec mv {} `echo {} | tr \? X` ';', ale leze z toho tohle find: mv ./file
> ./file are the same file. Diky za kazdou radu nebo nasmerovani.
To bude nejspis tim, ze `echo {} | tr \? X` se provede jeste davno pred
tim, nez find zacne hledat nejake soubory. Dalsi problemy jsou ty, ze
-name '*?*' najde vsechny soubory a spol., ktere maji aspon jednoznakovy
nazev, cili uplne vsechny, a ten, ze find bez -depth nejdriv zpracuje
samotny adresar, a pak teprve jeho polozky, cili se muzete ucinne strelit
o nohy, kdyz si prejmenujete adresar. Pokud chcete provest to, co jste
popisoval, pak musite udelat napr.
find . -name '*\?*' -depth -print -exec sh '
d="`dirname "$0"`"
b="`basename "$0"`"
b2="`echo "$b" | tr "?" X`"
mv "$d/$b" "$d/$b2"
' {} \;
Tohle je ovsem dost neefektivni: pro kazdy soubor se spousti novy shell
a v nem nekolik dalsich prikazu. Pokud by hledanych souboru bylo hodne,
dalo by se treba kouzlit v Titaniku nasledujicim zpusobem:
find . -name '*\?*' -depth -print0 | perl -n0e '
chomp;
my @p = split(/\//);
my $b = pop(@p);
my $b2 = $b; $b2 =~ tr/?/X/;
my $d = $#p >= 0 ? join("/", na p) : ".";
if (-e "$d/$b2") {
warn("$d/$b2 does already exist, $b not renamed\n");
} else {
rename("$d/$b", "$d/$b2") ||
warn("rename $d/$b -> $b2: $!\n");
}
'
P.S. veskery kod uvedeny v tomto prispevku je pouze ukazkovy, neni
garantovana jeho spravna funkcnost a jeho pouziti je mozne pouze na
vlastni nebezpeci
--Pavel Kankovsky aka Peak [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."
Další informace o konferenci Linux