rekurzív átnevezés

Fórumok

Sziasztok!

Van egy hatalmas könyvtárszerkezetem amiben van sok .mp3, néhány .txt illetve néhány kiterjesztés nélküli fájl.

Az utóbbi kettő (.txt és kiterjesztés nélküli) típust szeretném átnevezni command line-ból, úgy hogy rejtettek legyenek (azaz . kerüljön a nevük elé).

Próbáltam szimplán rename paraccsal de az sajnos nem tudja -R kapcsolóval bejárni az alkönyvtárakat.

Tudnátok nekem segíteni, melyiket hogy nevezzem át?

Köszönöm előre is.

Hozzászólások

Közvetett módon?
top=`pwd`; for dir in `find . -type d`; do cd $dir; rename --kapcsolo argumentumok; cd $top; done

Ha tényleg csak a fenti fájlok vannak ott, akkor kb. ennyi:

find /dir/ ! -name '*.mp3' -type f -exec mv {} .{} \;

Mondjuk nem rekurzív, de arra nincs is szükség, sőt, csak bonyolítaná a dolgot.

JAVÍTÁS: ez nem jó! Persze, mert én csak könyvtárstruktúra nélkül próbáltam, ott működik.

Loptam f0hxu-tól :D

http://pastebin.com/eLqFSGg5

Az idézőjelek nagyon fontosak ha van szóköz is a fájl- vagy könyvtárnevekben.

Linux + bash-t feltételezve


for i in $( find . -type f \( ! -name "*.*" -o -name "*.txt" \));
do
    mv $i $(echo $i | sed -e 's/\(.*\/\)\(.*\)$/\1.\2/'); 
done

--
A gyors gondolat többet ér, mint a gyors mozdulat.

a rename úgy ahogy van egy kalap sz*r. minden disztribúción más a syntax/használat. hanyagold.

van egy "fájl normalizációs" scriptem, mv-t használ find-al [egy loop-ban, depth-el kombinálva], anno arra használtam, hogy a mindenféle hülye nevekből, pl.: "(2009)-válami.vs.Mittomén'.mp3"-ból pl.: "2009-Valami-vs-mittomen.mp3"-at készítsen rekurzívan, stb


for i in $(find . -depth -type f -name "*.txt" -print)
 do
 mv $i $(echo $i | sed 's/\/\([^\/]*.txt\)$/\/.\1/')
done

De csak ha nincs szóköz a fájlnevekben és az útvonalban.

szokozokkel is megy:


op@pandora-d test> find . -name "*.txt"
./test 10/test2/dfgh sdfsds fssdfsdfsdf dfdf.txt
./test 10/dfghdf.txt
./test 10/dfgh sdfsdfsdfdf.txt
./dfghdf.txt
op@pandora-d test> bin/recursor.csh
./dfgh sdfsds fssdfsdfsdf dfdf.txt -> .dfgh sdfsds fssdfsdfsdf dfdf.txt
./dfghdf.txt -> .dfghdf.txt
./dfgh sdfsdfsdfdf.txt -> .dfgh sdfsdfsdfdf.txt
./dfghdf.txt -> .dfghdf.txt
op@pandora-d test> find . -name "*.txt"
./test 10/test2/.dfgh sdfsds fssdfsdfsdf dfdf.txt
./test 10/.dfghdf.txt
./test 10/.dfgh sdfsdfsdfdf.txt
./.dfghdf.txt

recursor.csh:


#!/bin/csh

set exec_p = /tmp/test/bin/recursor.csh

foreach i ( "`find . -type d -depth 1`" )
        (cd "$i"; $exec_p)
end

foreach j ( "`find . -depth 1 -name '*.txt'`" )
        mv -v "$j" ".`basename '$j'`"
end

mondjuk nem a leggyorsabb

szerk.:

es igen, csh-ban nincsenek fuggvenyek :)
___
info

Engem is erdekel, feliratkozom.

a keresést már láttad, az átnevezést normális linuxon így érdemes:

mv $i $(dirname $i)/.$(basename $i)

Vegignezve a sok epito jellegu scripten, sztem jobban jarsz egy total commanderrel :-)

+1 Total Commander :)
De azért itt egy működő script, amit nem gyilkol le egy szóközös fájlnév:

perl -e 'sub a{my$x=shift;opendir(my$d,$x);while(readdir($d)){my$p="$x/$_";next if($_=~/^\.\.?$/||!-r$p);if(-d$p){&a($p)}elsif($_=~/^[^\.]+(?:\.txt)?$/){rename($p,"$x/.$_")}}closedir($d)}&a("/tmp")'

Azért arra kíváncsi lennék, hogy van-e még ép fájlrendszered :D