Odpowiedzi:
Jeśli musisz zmienić nazwy plików również w podkatalogach, a Twój predykat find
obsługuje -execdir
, możesz to zrobić
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Dziękuję @glenn jackman za zasugerowanie -depth
opcji find
i skłonienie mnie do myślenia.
Zauważ, że w niektórych systemach (w tym GNU / Linux) find
może nie być w stanie znaleźć plików, których nazwa zawiera spacje, a także sekwencje bajtów, które nie tworzą prawidłowych znaków (typowe dla plików multimedialnych o nazwach ze znakami spoza ASCII zakodowanych w zestawie znaków inne niż ustawienia regionalne). Ustawienie ustawień regionalnych na C
(jak w LC_ALL=C find...
) rozwiązałoby problem.
-depth
opcji znajdź , a możesz się go pozbyć sort
.
-name '* *'
na -name '*_*'
i zmień "${1// /_}"
na"${1//_/.}"
bash
stronie podręcznika użytkownika.
W dowolnej powłoce możesz przeglądać pliki, których nazwa zawiera spację. Zamiana spacji na znaki podkreślenia jest łatwa w bash, ksh i zsh za pomocą ${VARIABLE//PATTERN/REPLACEMENT}
konstruktu.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
Na Debianie, Ubuntu i pochodnych możesz używać Perla rename
(inne dystrybucje dostarczają inny program jako rename
, a ten program nie jest tutaj pomocny).
rename 's/ /_/g' *
Obowiązkowe rozwiązanie Zsh:
autoload zmv
zmv '(*)' '${1// /_}'
Obowiązkowe rozwiązanie POSIX:
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
s/…/…/g
oznacza zastąpienie wszystkich wystąpień. Nie jest to dobrze wyjaśnione w instrukcji . Jeśli chcesz zmienić nazwy katalogów, istnieją sposoby, poszukaj go (myślę, że już go widziałem), a jeśli nie możesz go znaleźć, zadaj nowe pytanie.
_MG_blah.JPG
na IMG_blah.JPG
.
Możesz rename
do tego użyć (tutaj zakładając, że ten z util-linux
, nie ten perl
):
cd /path/to/dir
rename ' ' _ *\ *
Spowoduje to znalezienie przestrzeni wszystkich plików i katalogów w nazwie i zastąpienie spacji znakiem podkreślenia. Ponieważ korzysta z dopasowywania plików glob, na początek musisz znajdować się w odpowiednim katalogu.
Jeśli chcesz wykonywać rekurencyjne dopasowania, możesz, ale może być konieczne wykonanie rename
kilku razy, aby złapać dowolne elementy w katalogach, których nazwy zostały zmienione:
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
rename
Zmieni nazwy określonych plików, zastępując pierwsze wystąpienie z w ich nazwie słowem„ do ”. To będzie działać tylko w przypadku plików z pojedynczą spacją w nazwie. (Możesz zadzwonić rename
w pętli, ale tak naprawdę nie jest to właściwe narzędzie.)
Inną opcją byłoby mmv
, jeśli zainstalowano.
mmv \*\ \* \#1_#2
_
, nie działa na nazwach z wieloma spacjami.
Na Debianie / Ubuntu, w oparciu o odpowiedzi Caleba i Gillesa, działało dla mnie, aby zmieniać nazwy plików rekurencyjnie:
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
Uwaga: Aby wyświetlić podgląd plików, które zostaną przemianowane i jak, użyj -n
przełącznika z rename
:
rename -n 's/ /_/g' **
Inna uwaga: ustawienie globstar
powoduje, że **
pliki dopasowania są we wszystkich podkatalogach, więc jeśli pożądany jest tylko bieżący katalog, nie ustawiaj globstar ani nie używaj *
zamiast niego **
.
Jeszcze jedna uwaga: rename
polecenie musi zostać uruchomione więcej niż jeden raz dla plików z wieloma wystąpieniami wyszukiwanego terminu.
a b/c d
na a_b/c_d
nie działa, musisz najpierw zmienić nazwę a b/c d
na a b/c_d
, a następnie a b
na a_b
).
rename
dwukrotne uruchomienie tego samego polecenia?
**
wyklucza pliki kropkowe i trawersuje dowiązania symboliczne.
Jeśli nie masz flasha na wyrażeniach regularnych (nie jestem!) I możesz uruchamiać aplikacje zaprojektowane dla KDE (albo używasz KDE - K Desktop, albo masz zainstalowane biblioteki), to Krename to świetne narzędzie graficzne, które pozwala zobaczyć przed i po przed zobowiązać się do zmian. Ma wiele prostych przekształceń jako opcji, a także obsługuje wyrażenia regularne. Możesz nawet połączyć kilka kolejnych transformacji w jedną zmianę nazwy, więc nie musisz projektować jednej złożonej transformacji, która robi to wszystko jednocześnie. Ma również opcję kontynuowania zmiany nazw tych samych plików po zastosowaniu zmiany nazwy.
Nie używam go tak często, ale kiedy to robię, naprawdę szybko i łatwo wykonuje pracę. Naprawdę przydaje się przy zmianie nazw różnych pobranych plików multimedialnych, aby można było nimi jednolicie zarządzać w systemie. Pomaga osobno pobrać instrukcję krename, dzięki czemu można się do niej odwoływać podczas korzystania z programu.
find -maxdepth 1
aby zrobić dokładnie to, o co OP poprosił o działanie w bieżącym folderze.