Existuje prename
, který vám umožňuje používat REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Použijte volbu -n
simulovat:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Poznámka: Toto je odesláno jako rename
v mnoha distribucích Linuxu, ale ne ve všech – proto používám kanonický název nástroje, který je součástí Perlu.
Navrhoval bych něco takového:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
nahradí první výskyt *-doc-
s doc-
.
Pokud potřebujete provést více než jednu výměnu (viz komentář číslo 1), musíte použít ${var//Pattern/Replacement}
varianta. Pokud potřebujete nahradit začátek názvu, musíte použít ${var/#Pattern/Replacement}
, pokud potřebujete nahradit konec (tj. příponu), musíte použít ${var/%Pattern/Replacement}
formulář.
Další podrobnosti najdete v části Rozšíření parametrů prostředí. Toto rozšíření je specifické pro bash.
Pokud máte rename
pak rename 's/^.*-doc-/doc-/' *.txt
měl by stačit.
Pokud se chcete vrátit do podadresářů, je zde také:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
V systému, který automaticky podporuje rozšířené Regexpy, můžete -E
vynechat .
Výhody:
- vrací se do podadresářů
- můžete ovládat maximální hloubku rekurze
- můžete přejmenovat soubory a/nebo adresáře (-type f|d)
Nevýhody:
- trochu složitější regulární výrazy, protože musíte odstranit cestu, abyste se dostali k názvu souboru
(odpověď upravena odtud)