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.
- 312 megtekintés
Hozzászólások
jól megszopattak ezzel a melóval így szilveszter napján
- A hozzászóláshoz be kell jelentkezni
Igen. :-)
Viszont nem sürgős és nem határidős. Csak most volt kedvem foglalkozni vele.
- A hozzászóláshoz be kell jelentkezni
Írd át másolásra, és ha jól sikerült, töröld le a régit!
De ezt is érdemes megnézni:
Nagy Gábor https://sign-el-soft.hu
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
Igen, pontosan erre gondoltam!
Azt még ki kell találnom, hogy a szkript fájlból olvassa ki a sorokat, de ez lesz amire szükségem lesz!
Hálás köszönet!
- A hozzászóláshoz be kell jelentkezni
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
...
- A hozzászóláshoz be kell jelentkezni
Szuper, erre nem is gondoltam, pedig használtam is már (mikor létrehoztam a könyvtárszerkezetről a txt fájlt).
Kipróbálva!
Kiválóan működik! Nagyon-nagyon köszönöm!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Több (tíz)ezer sort kellene módosítani, ami aránytalanul nagy meló lenne... ...de azért köszönöm!
- A hozzászóláshoz be kell jelentkezni
(Programmal, természetesen. Itt van rögtön a tr(1).)
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Ez is jó! Köszönet!
- A hozzászóláshoz be kell jelentkezni
Végül ezt használtam, mivel ssh-n hozzáfértem a forráshoz, így ez a módszer praktikusnak tűnt.
De köszönöm mindenkinek az ötleteket, mind nagyon hasznos volt!
- A hozzászóláshoz be kell jelentkezni
install -D /dev/null /ezt/akarom/létrehozni/valami.txt
- A hozzászóláshoz be kell jelentkezni