Szóközök cseréje fájlnévben

Szóközök cseréje Linux alatt fájlnevekben. Sok fájlnév szóközöket is tartalmaz. Ezek kezelése nem mindig elegáns Linux alatt. Bár a Linux elég fejlett operációs rendszer, de ez még midig fennálló probléma lehet és erre kell valami megoldást találni. Több shell nem kezeli őket rendesen, egyes programok pedig nem ismerik fel egy fájlnévnek, ha abban szóköz van. Ilyenkor fura, nem feltétlen egyértelmű hibajeleket kapunk.

Mi lehet a megoldás? A legjobb, ha nem használunk szóközt, így nem lesz probléma az ilyen fájlokkal: Ez egy minta fájl.txt.

Bár sok megoldás létezik a probléma kezelésére, és vannak olyan megoldások is, amikor ez ilyen fájlneveket kezelhetővé tesszük a shell-nek, vagy az adott programnak, azáltal, hogy idézőjelbe rakjuk a fájlnevét, de ez elég macerás tud lenni.

Jobb megoldás, ha előbb egy semleges karakterré alakítjuk át a szóközt a fájl nevében, mert akkor nincs ilyen probléma. A legegyszerűbb az aláhúzás karaktert használni. Ez_egy_minta_fájl.txt, így már nem lesz ezzel problémánk.

Amit én használok: rnm

A fáljnév konvertálásra én az rnm programot használom, ami nagyon sokat tud és már volt is róla szó. Így csak a megoldást mutatom be:

rnm -dp 5 -rs '/ /_/g' ./*

Az megadott könyvtár mélységig, az rnmösszes fájt "szóközteleníti". Egyszerű, sokat tud és egyszer kell kipróbálni.

Az rnm-mel egy probléma van: nem feltétlenül egyszerű a telepítése, Arch alatt az AUR-ban van, de Debian alatt nincsen benne a tárolókban.

Így felmerül az igény olyan megoldásokra is, amiknél egypár fájl kezelésre nem kell telepíteni semmit. Erre is van lehetőség!

A példa az összes txt fájlnévben cseréli le a szóközt aláhúzásra.

Szóközök eltávolítása a fájlnévből meghatározott fájlkiterjesztéssel

Logikusan két lépésben kell megoldani a problémát. Előbb megkeressük a txt fájlokat, majd szóközöket lecseréljük. Aki keresett már, a find parancsot ismeri, az átnevezni az mv az alap parancsunk. A man(ual) és a -help segítségünkre lesz, ha nem ilyen sablon parancsot akarunk használni, az összes lehetőség áttekintése igencsak sok jó ötletet adhat!

find . -type f -name "* *.txt" -exec bash -c 'mv "$0" "${0// /_}"' {} \;

Keressen a könyvtárban olyan fájlokat, amiknek a kiterjesztése .txt, majd adja át a találatot az mv parancsnak, úgy, hogy a szóközt alakítsuk át aláhúzássá. Ezt jelenti ez a parancs. Itt a lényeg a .txt, amit arra írsz át, amire kell, illetve a ${0// /} tagunk, amiben a szóköz és az aláhúzás jel változtatásával szabhatod át parancsot magadnak.

Így már megoldható a legtöbb keres-csere is a fájlnevekben.

Bár pluszban telepíteni kell egy kis programot, de kényelmes megoldás a rename használata.

Fájlnév szóközök cseréje rename parancs használatával

$ sudo apt install rename         [Debian, Ubuntu, Mint]
$ sudo yum install rename         [RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux]
$ sudo emerge -a sys-apps/rename  [Gentoo Linux]
$ sudo pacman -S rename           [Arch Linux]
$ sudo zypper install rename      [OpenSUSE]   

Így tudod telepíteni a rename parancsot a hivatalos tárolókból.

A használata valamivel egyszerűbb, mint az rnm-é, vagy az előbbi kissé összetett parancs, ahol a find és az mv együttest használtuk.

Az összes txt fájlt így:

rename 's/\s/_/g' ./*.xml

az összes fájlt pedig így:

rename 's/\s/_/g' ./*.* 

szóköztelenítheted.

Itt is igaz, hogy a program ennél többet, így érdemes olvasgatni.

Ha ennyi még nem volt elég, akkor egy elegánsabb megoldást is használhatunk.

A for ciklus használata a fájlnevek átírásához

A for ciklus függvény lekérdezi a célkönyvtárban lévő szóközöket a fájlnévben, majd aláhúzás jellel helyettesíti. Igen, ezek nem csak szkriptben működnek, hanem sima parancssorban is!

 for f in *; do mv "$f" echo $f | tr ' ' '_'; done

Ahogy láthattuk vannak megoldások a szóköztelenítésre, így semmi probléma nem lehet, ha egyes shell-ek, vagy programok panaszkodnak a szóközökre a fájlnevekben.

Ha mindenképp szóközökre lenne szükséges a fájlnevekben és olyan műveleteket szeretnél elvégezni, ami ez nem tolerálja, akkor előbb kicseréled aláhúzásra, majd amikor minden kész vissza. Ezért kényelmes a parancssor, mert majdnem mindent megoldhatunk benne.