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