fájlok mappák átnevezése

Kicsit feladták a leckét. Van vagy 5 évnyi adat melyben figyelmetlenségből akadnak olyan mappa és fájlnevek melynek az elején vagy a végén egy vagy több szóköz található. Nos ezeket lehetetlen kiírni NTFS meghajtóra. Eddig azért nem volt gond mert az adatmentés is ext4 fájlrendszerre került.

IFS=$'\n'
# ez törli a szóközöket a nevek elejéről
find . -depth -name ' *' | while read f; do
    mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's/^ *//;s/ *$//')"
done

# ez törli a szóközöket a nevek végéről
find . -depth -name '* ' | while read f; do
    mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's/^ *//;s/ *$//')"
done

Kitaláltam ezt, de vannak olyan nevek is sajnos, melyek nem betűkkel kezdődnek hanem mondjuk :-tal. Az ilyen speciális nem odavaló karaktereket hogyan lehetne törölni? Erre most nem fog az agyam. Bár nem tudom hogy az ilyenek gondot okozhatnak-e a Windowsnak . Ha nem, akkor akár maradhat is.

Hozzászólások

Hasonló problémára a detox egy jó megoldás lehet, de ha esetleg van vim a gépen (és "értesz" is hozzá), akkor a vim-renamer lehet egy jó eszköz (nálam a vimv egy alias, hogy a vim ezt "indítsa").

Pár kérdés:

- Fenti script miért dobja el a fájlnév elejéről *is*, meg a végéről *is* a szóközöket mind a két ciklusban, ha amúgy a megjegyzés szerint az első ciklus az elsőt a második pedig a másodikat tenné csak?

- Miért nem egy db find -ot futtatsz, amiben a két -name szerepel \( -name 'X' -o -name 'Y' \) formában (és az eredeti dupla sed-del) ?

- és ha már, miért ne lehetne tök ugyanígy a :-ot (vagy bármi egyebet) törölni?

Amúgy pedig +1 a detox-ra.

Szerkesztve: 2021. 01. 05., k – 17:30

Ha csak egy iciri-piciri esélyt kaphat egy pythonos fickó :-), akkor itt van ez:

import sys, uuid, pathlib as pth
#import re

# test data
for fn in ["helló", "  first and last   ", " : : helló : : ", ": helló", " helló : : halló : "]:
    pth.Path(fn).touch()

#------
input("Press Enter to proceed...")

for p_fi in pth.Path(sys.argv[1]).rglob("*"):

    fn= str(p_fi)
    #new_fn= re.sub(r"^[ :]*(.*?)[ :]*$", r"\1", fn)
    new_fn= fn.strip(" :")
    if fn != new_fn:

        p_new_fi= pth.Path(new_fn)
        if p_new_fi.exists():
            p_new_fi= p_new_fi.with_suffix(f".{uuid.uuid4()}")

        print(f">{fn}<\n>{p_new_fi}<\n")
        p_fi.replace(p_new_fi)

Még ki lehetne egészíteni egy --dry-run opcióval is.

Eddig azért nem volt gond mert az adatmentés is ext4 fájlrendszerre került.

 

Ha csak mentés, akkor tar, (ha tömöríthető formátum akkor xz -vel) és nincs probléma. :-)