Tesztkörnyezet fájlok tömeges átnevezéséhez

Sziasztok!

Segítséget szeretnék kérni egy bash szkripthez, amely egy szöveges fájlban tárolt fájlútvonal/fájlnév listából rekonstruálni tudja az eredeti  fájlútvonal/fájlnév szerkezetet egy teszt mappába. A fájloknak természetesen csak a neve és kiterjesztése lényeges, a tartalma lehet nulla hosszúságú/tartalmú állomány is.

Erre azért lenne szükségem, mert megörököltem egy olyan fájlrendszert, melyben rettenet hosszú mappa és fájlnevek találhatóak, gyakran megtűzdelve mindenféle egzotikus karakterrel (ékezet, pont, sok egymást követő pont, szóköz, felkiáltójel stb.). Ezekből a nevekből szeretném kiírtani a "problémás" karaktereket, melyre van már egy kész megoldásom, csak szeretném tesztelni is és megnézni a végeredményt mielőtt élesben ráküldöm a meglévő adatokra.

Példa:

./Adattár/Fotótár (archiv)/Történeti/Iskola/Homorszögi általános iskolai tanulók csoportképei az 50-es évekből/1958-59 Körmendy Tamás zenetanárral.JPG
./Adattár/Fotótár (archiv)/Történeti/Iskola/Homorszögi általános iskolai tanulók csoportképei az 50-es évekből/1954-55 Kovács Anna tanítónővel2.JPG
./Adattár/Fotótár (archiv)/Történeti/Iskola/Homorszögi általános iskolai tanulók csoportképei az 50-es évekből/1954-55 Kovács Anna tanítónővel1.JPG

Ebből kellene rekonstruálni a mappaszerkezetet és az üres fájlt.

Fájlok nélkül, csak a mappaszerkezetet a

xargs '\n' mkdir -p -- < teszt.txt

utasítással tudom rekonstruálni, viszont kellenének a fájlok nevei is.

Előre is köszönöm az ötleteket.

Hozzászólások

jól megszopattak ezzel a melóval így szilveszter napján

Mármint, valami ilyenre gondolsz?

#!/bin/sh

while
  read LINE
do
  DIRNAME=$(dirname "$LINE")
  BASENAME=$(basename "$LINE")

  mkdir -p "$DIRNAME"
  touch "$DIRNAME/$BASENAME"
done

Ebből persze a $BASENAME gyakorlatilag fölösleges, mert egyből létrehozhatod helyette a $LINE-t is akár.

A script standard inputról olvas, tehát csak bele kell irányítanod a fájlt az STDIN-be:

./script.sh < teszt.txt

de, ha mindezt a scripten belül szeretnéd megoldani, akkor a benne lévő while elé tegyél pl. egy cat-ot:

cat teszt.sh | while
...

Szívesen. Ha esetleg még elegánsabban szeretnél fájlból beolvasni (pl. cat nélkül), akkor az egész while ciklust összefoghatod, és beleöntheted a fájlt az alábbi módon:

#!/bin/sh

{
  while
    read LINE
  do
    DIRNAME=$(dirname "$LINE")
    BASENAME=$(basename "$LINE")

    mkdir -p "$DIRNAME"
    touch "$DIRNAME/$BASENAME"
  done
} < teszt.txt

... de ez már csak dizájn kérdése.

Szerkesztve: 2021. 12. 31., p – 11:22

Az is elég, ha egy újabb text-fajlt hozol létre, ami ilyesmi sorokat tartalmaz:

mkdir -p $TARGET/Adattar/Fototar__archiv_/Torténeti/Iskola/Homorszogi_altalanos_iskolai tanulok_csoportkepei_az_50-es_evekbol/
   cp -p $SOURCE/Adattár/Fotótár (archiv)/Történeti/Iskola/Homorszögi általános iskolai tanulók csoportképei az 50-es évekből/1958-59 Körmendy Tamás zenetanárral.JPG \
         $TARGET/Adattar/Fototar__archiv_/Torténeti/Iskola/Homorszogi_altalanos_iskolai_tanulok_csoportkepei_az_50-es_evekbol/1958-59_Kormendy_Tamas_zenetanarral.JPG

cp -la, hardlinkel "atmasolja" masik konyvtarba. uj helyen mar barmit tudsz csinalni, csak ne modositsd a fajlt. atnevezeskor meg ugyis tiltod a felulirast, igy nem tud ket fajl egymasra pakolni.

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

alternativa, megcsinalod a konyvtar szerkesztet (a sort arra kell hogy megfelelo sorrendben csinalja a konyvtarakat):

find /itt/vannak/most/ -type d -printf "%P\0"|sort -z|(cd /ide/kerem; xargs -0 mkdir)

majd a fajlokat:

find /itt/vannak/most/ -type f -printf "%P\0"|(cd /ide/kerem; xargs -0 touch)

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

install -D /dev/null /ezt/akarom/létrehozni/valami.txt