it-swarm-eu.dev

Jak nahradit jeden znak jiným ve všech názvech současných adresářů?

Jak přejmenujete všechny soubory/podadresáře v aktuální složce?

Řekněme, že mám mnoho souborů a podadresářů, které jsou mezerami, a chci nahradit všechny mezery podtržítkem.

File 1
File 2
File 3
Dir 1
Dir 3

by měla být přejmenována na

File_1
File_2
File_3
Dir_1
Dir_3
43
NobbZ

Pokud potřebujete přejmenovat soubory také v podadresářích a vaše find podporuje -execdir predikát, pak můžete udělat

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Děkuji @glenn jackman za doporučení -depth volba pro find a nutit mě přemýšlet.

U některých systémů (včetně systémů GNU/Linux) může find selhat při hledání souborů, jejichž název obsahuje mezery a také sekvence bajtů, které netvoří platné znaky (typické u mediálních souborů se jmény s jinými než ASCII znaky kódované v znakové sadě odlišné od národních jazyků). Nastavení národního prostředí na C (jako v LC_ALL=C find...) by problém vyřešil.

37
enzotib

V libovolném prostředí můžete procházet soubory, jejichž název obsahuje mezeru. Nahrazení mezer podtržítky je snadné v bash, ksh a zsh pomocí ${VARIABLE//PATTERN/REPLACEMENT} konstruovat.

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

V Debianu, Ubuntu a derivátech můžete použít Perl rename (jiné distribuce dodávají jiný program jako rename a tento program zde není užitečný).

rename 's/ /_/g' *

Povinné řešení zsh:

autoload zmv
zmv '(*)' '${1// /_}'

Povinné řešení POSIX:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

K tomu můžete použít rename (zde za předpokladu, že jeden z util-linux, nikoli Perl one):

cd /path/to/dir
rename ' ' _ *\ *

Tím se v názvu najdou všechny soubory a adresáře a místo se nahradí podtržítkem. Protože používá globování souborů, musíte být ve správném adresáři, abyste mohli začít.

Pokud chcete dělat rekurzivní zápasy, můžete, ale možná budete muset provést párkrát rename, abyste zachytili všechny položky v adresářích, které byly přejmenovány:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
13
Caleb

Jiná možnost by byla mmv, pokud by byla nainstalována.

mmv \*\ \* \#1_#2
2
glglgl

V Debianu/Ubuntu, na základě odpovědí Caleba a Gillesa, to pro mě bylo rekurzivní přejmenování souborů:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Poznámka: Chcete-li zobrazit náhled, jaké soubory by se přejmenovaly a jak, použijte -n přepínač s rename:

rename -n 's/ /_/g' **

Další poznámka: nastavení globstar dělá ** odpovídá souborům ve všech podadresářích, takže pokud je požadován pouze aktuální adresář, nenastavujte globstar ani nepoužívejte * namísto **.

Ještě jedna poznámka: Příkaz rename musí být spuštěn více než jednou pro soubory s více výskyty hledaného výrazu.

1
Markus Pscheidt

Pokud nejste regulárními výrazy flash (nejsem!) A můžete spouštět aplikace určené pro kde (buď používáte plochu kde - k nebo máte nainstalované knihovny), pak krename je skvělý grafický nástroj, který umožňuje zobrazit před a po před , které se zavazujete ke změnám. Má řadu jednoduchých transformací jako možností a také podporuje regulární výrazy. Můžete dokonce kombinovat několik sekvenčních transformací do jedné přejmenování, takže nemusíte navrhovat jedinou komplexní transformaci, která to všechno provede najednou. Má také možnost pokračovat v přejmenování stejných souborů po použití přejmenování.

Nepoužívám to tak často, ale když to udělám, opravdu to udělá práci rychle a snadno. Při přejmenování různých stažených mediálních souborů to opravdu přijde vhod, abyste je mohli ve svém systému spravovat jednotně. Pomáhá stahovat příručku krename samostatně, takže na ni můžete během používání programu odkazovat.

http://www.krename.net/

0
Joe