Leszeretnék tölteni egy fájlt, de sajnos nem tudom mert a fájlnév "/" karaktert tartalmaz. A Linux meg ezt nem igazán tolerálja. Tehát a fájl nevét ismerem, és meg kellene találnom benne a / karaktert, melyet át kellene neveznem mondjuk valamelyikre ezek közül:
U+2044 = Tört perjel: ⁄
U+2215 = osztás perjel: ∕
U+29F8 = Big Solidus: ⧸
U+FF0F = Teljes szélességű tömörség: ╱
U+2571 = Dobozrajzok átlója: ╱
A bash scriptem pontosan megtalálja a fájl nevét, de nem tudja letölteni. Letöltendő fájl neve: "blabla TV/reg blabla.pdf"
1 - Meg kell tudnom hogy a letöltendő fájl neve tartalmaz-e / karaktert. (Szerintem itt a find nem segít)
2 - Ha igen, akkor a fájlt másik névvel kell letölteni. Vagy a már említett / jelek egyikével, vagy nemes egyszerűséggel kötőjellel.
Hogy járjak el?
- 636 megtekintés
Hozzászólások
blabla%20TV%2Freg%20blabla.pdf
- A hozzászóláshoz be kell jelentkezni
Nem kell megkeresned :-) Elég "vakon" lecserélned valami másra. Ilyemire pl. a tr teljesen alkalmas lehet:
fn='akarmi/valami'
fn="{tr '/' '_' <<< $fn )"
Ez pl. azt a törtjelet aláhúzásra cseréli - ha van. Ha nincs, akkor nem bánt semmi mást. Gőzöm nincs, a linuxos tr kezel-e UTF-8-as karaktereket, de ha valami csoda folytán nem, akkor fenti tr-t cseréld le a perl tr nevű operátorával - mondjuk az nem 10, hanem legalább 30 byte hosszú lesz. (Ha nem bash -t használsz, akkor a $( ) -en belül echo $fn | tr '/' '_' írandó, mert elég kevés sehll ismeri a <<< átirányítást.
(Már csak azt nem értem, hogy a letöltéshez mi köze van a / jelnek.)
- A hozzászóláshoz be kell jelentkezni
Ok. Köszi ez működik is, De ez csak akkor fontos ha ténylegesen van benne / jel. De ha nincs? Mivel ez egy bash script valahogy elemeznem kellene hogy van-e benne / karakter. Ha nincs, nem kellene a tr-t is behívnom, Bár hibaüzenet nem ad.
- A hozzászóláshoz be kell jelentkezni
Ha a letöltés a lényeg, és nem az, hogy a file nevében eredetileg volt-e / vagy nem, akkor ez a megoldás megfelelő. A 'felesleges' tr hívás nem fogja túlzott mértékben leterhelni a rendszert.
- A hozzászóláshoz be kell jelentkezni
De ez csak akkor fontos ha ténylegesen van benne / jel. De ha nincs?
Akkor nem cserél le semmit. Baj?
Mivel írod, hogy bash-t használsz, itt van egy tr nélküli verzió:
#! /bin/bash
name="blabla TV/reg blabla.pdf"
echo "${name//\//-}"
- A hozzászóláshoz be kell jelentkezni
Idézet. Kiemelés tőlem:
Ez pl. azt a törtjelet aláhúzásra cseréli - ha van. Ha nincs, akkor nem bánt semmi mást.
- A hozzászóláshoz be kell jelentkezni
(Már csak azt nem értem, hogy a letöltéshez mi köze van a / jelnek.)
Végül is semmi, eltekintve attól az igen ritka esettől, amikor a fájlt egy fájlrendszerbe akarod letölteni és ott tárolni :-)
A céges jogászokat évekig kellett idomítanom, hogy ne olyan néven akarjanak menteni, ami tele van "/" karakterekkel. Pl. windowsos alkalmazásoknál technikailag van rá lehetőség, csak a végén jön a pánik, hogy hova lett a fájl, és miért keletkezett öt szintű könyvtárszerkezet a célmappában :-)
- A hozzászóláshoz be kell jelentkezni
"Hogy járjak el?"
Először is, ezt olvasd el: http://www.catb.org/~esr/faqs/smart-questions.html
Ha az angol nem megy, akkor a Google Translate vagy Deepl ami segíthet.
A leírásod alapján nem a probléma megoldása a nehéz, hanem kikönyörögni tőled az ahhoz szükséges részinformációkat (írom ezt az alapján, ahogy az elmúlt mondjuk tíz évben feltetted a kérdéseidet).
- A hozzászóláshoz be kell jelentkezni
Volt idő amikor leírtam részletesen a problémámat. Ezt talán a regisztrációm legelején tettem. De akkor jött a fekete leves hogy miért így csinálom, megőrültem vagy mi? Tehát nem segítséget, hanem az oltást kaptam. Ezért eldöntöttem hogy soha nem írom le, hanem csak körülírom a problémámat. Miért jó ez nekem? Mert látom hogy ez nem az a fajta fórum ahol meg is magyarázzák a dolgokat hogy mit miért kellene úgy tennem ahogy ajánlják.
Ez nem egy stackoverflow. Itt kemény személyeskedés megy, S ha nem akarjátok meg IS magyarázni a folyamatot hogy mi miért, akkor én minek törjem magam hogy részletes legyek? Aki érti érti, aki nem az menjen el szövegértési tanfolyamra. Az emberek különbözőek, és emiatt különböző meglátásuk felfogásuk van a világról. Megkaptam az oltást azért, hogy minek nekem bing háttérkép? Először is úgy gondolom hogy senkinek semmi köze hozzá. A másik, ha nem akar segíteni, akkor legalább ne oltson hanem maradjon csendben.
- A hozzászóláshoz be kell jelentkezni
Najó, de látod hogy így is le kell írni mindent, megy az értetlenkedés, holott például ha tudnánk, hogy pl. wget vagy curl, vagy mifene akkor tudnánk konkrét példát mondani, hogy mi legyen (hogyan kell megadni*) az output fájl neve (bár az adott esetben szerintem eleve az URL encoding szerint menti el, szóval elve fura valami), és hogyan lehet azt legyártani.
És amúgy igen, ismerem a jelenséget, hogy az, aki nem tudja a megoldást, megpróbálja elmagyarázni, hogy hülyeség az egész. És nem lehetetlen amúgy hogy igaza van (50-50%).
Na mindegy, majd lesz valami.
*) Nade az meg man wget/curl/mifene, ami megint visszavezet oda, hogy léci energiát ölni a probléma megértésébe.
- A hozzászóláshoz be kell jelentkezni
Ez milyen FS?
Hogyan kerultek oda ezek a fileok?
Be tudod tolteni azt az OS-t, ami ezt elkovette?
Linux alatt ott a debugfs. Russian roulette csore toltve...
- A hozzászóláshoz be kell jelentkezni
A rendszerem ext4. S még nem kerültek oda a fileok fájlok, mert az a fájl a neten van ezzel a névvel, és csak szeretném letölteni egy script segítségével.
- A hozzászóláshoz be kell jelentkezni
Biztos, hogy ezzel a névvel van? Mert éppen azért nem lehet a filenévben '/', mert az az elérési út termináló karaktere. Azt el tudom képzelni, hogy a filenévben nincs '/', csak a link weblapon olvasható részében, tehát ami az <a> és </a> között van. Na jó, de annk meg semmi köze a file nevéhez, oda bármit lehet írni. Neked az kell, ami az <a> tag href="" részében van, ha legalább is jólértem a problémát, de ott a '/' jel nem a filenév, hanem a path termináló karaktere hasonlóan a lokális fs-hez.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Az operációs rendszerek valóban fenntartják ezt a karaktert, így fájlnévben nem szerepelhet, de akadnak olyan adatbáziskezelők, amelyek engedik. Ha rutinos fejlesztő implementálja az adatbáziskezelőt, akkor kapásból gyárt olyan adatmezőt is, amiben a fájlrendszer-kompatibilis fájlnév tárolódik, kihagyva vagy lecserélve a fájlrendszerek által nem tolerált karaktereket. Ugyanígy tesznek a böngészők is ezekkel a karakterekkel, ideértve egyes, magukat file managernek hazudó olyan megoldásokat is, mint például a Windows Explorer (az a bizonyos "Intéző"), amely, ha szerinte a lokális fájlrendszeren kívüli a fájl, rögtön az Internet Explorerben található fájlmentési rutinhoz fordul, teleszórva a fájlnevet "%" karakterekkel.
- A hozzászóláshoz be kell jelentkezni
Ha adatbázisból jön, akkor viszont az van, amit mondok, hogy a weben megmutatott szöveg az, de annak semmi köze a valós filenévhez. Nem <a>innen</a> kell kiszedni a letöltendő nevet, hanem <a href="innen">blabla</a>.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Igen. Itt van a kutya elásva. Valamiért kiment a fejemből, hogy ez valóban nem a tényleges fájl neve, hanem végül is én generálom le egy adatból, s ott meg így volt most megadva. Az elmúlt 5 év alatt egyszer sem fordult elő, így nemigazán értettem. Úgy kell elképzelni, mintha egy mp3 fájl ext információjából generálnám le a fájlnevet. Megoldottam.
- A hozzászóláshoz be kell jelentkezni
Én az egészet nem értem. Hogy lehetne a fájlt átnevezni, ha egyszer még le sincs töltve? Kéne látni ezt a scriptet is, ami le próbálná szedni, meg hogy lássuk, hogy mi a pontos URL, az még jobb lenne, ha az utóbbit hex formátumban tudnád betenni (átnyomod xxd vagy od valamelyikén), hogy pontosan lássuk milyen karakterek vannak benne, milyen kódolás.
Amúgy a sima / jelet kéne kezelnie a Linuxnak, annyi, hogy shellben, CLI-ben escape-elnek kell a szóban forgó / karaktert, így: \/
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
...shellben, CLI-ben escape-elnek kell a szóban forgó / karaktert...
Mi történne, ha a shell ezt a karaktert ignorálná? Hogyan adnád meg cli-ben egy fájl elérési útvonalát?
- A hozzászóláshoz be kell jelentkezni
Nem értem. Miért ignorálná. Ha nem teszed " karakter közé, akkor nem fogja ignoráni. Ha nincs escape-elve, akkor mappatagolónak fogja venni, ha van, akkor tényleges / karakternek, ami a fájlnév része. Simán megadható így:
wget https://www.blabla/dir/file\/name.extension
Azért is kértem pontos linket, hogy ki tudjam próbálni, tesztelni, hogy nálam letöltődik-e.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Valami nagyon el van tévesztve. Az általad adott példában a lokális, helyi shell elől takarod el a legutolsó törtvonalat. Holott a wgetnek átadott URL-lel majd a túloldali webszerver fog csinálni valamit. Akkor meg minek takarod a helyi shell elől?
Röviden: UNIX-like rendszerek jellemzően _lokális_ fájlnévben nem engednek meg / karaktert. Ha valami fájlnévnek látszik és van benne, akkor az elérési út része. Ha nem így lenne, nem tudnád megmondani, hogy az a/b az most az aktuális könyvtár "a" alkönyvtárában levő "b" nevű bejegyzés, vagy az aktuális könyvtárban levő "a/b" nevű bejegyzés-e.
(Speciel FAT és NTFS esetén az ezeket alapból használó, natív OS-ek a\b -t írnak, míg ha egy ilyen fájlrendszert felcsatolsz Linux, BSD (bármi *x) OS alatt, ott a/b -t fogsz használni.)
- A hozzászóláshoz be kell jelentkezni
Csak úgy általában "leszeretnéd tölteni", vagy valamilyen protokollt+programot használva?
- A hozzászóláshoz be kell jelentkezni
Le szeretnék....
- A hozzászóláshoz be kell jelentkezni
Van olyan katona, aki leszerel. Ő meg leszeret. Mit nem lehet ezen érteni? :D
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni