Відповіді:
Якщо вам також потрібно перейменовувати файли у підкаталогах, а ваш find
підтримує -execdir
предикат, тоді ви можете це зробити
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Дякую @glenn jackman, що він запропонував -depth
варіант find
і змусив мене подумати.
Зауважте, що в деяких системах (включаючи GNU / Linux) find
можуть не знайти файли, ім'я яких містить пробіли, а також послідовності байтів, які не утворюють дійсних символів (як правило, для медіафайлів з іменами з символами не ASCII, закодованими в наборі відрізняється від локальної). Встановлення локального значення C
(як в LC_ALL=C find...
) дозволить вирішити проблему.
-depth
опцією find , і ви можете позбутися цього sort
.
-name '* *'
до -name '*_*'
та перейти "${1// /_}"
на"${1//_/.}"
bash
сторінці man.
У будь-якій оболонці ви можете перебирати файли, ім'я яких містить пробіл. Замінити пробіли на підкреслення легко в bash, ksh та zsh за допомогою ${VARIABLE//PATTERN/REPLACEMENT}
конструкції.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
У Debian, Ubuntu та похідних ви можете використовувати Perl rename
(інші дистрибутиви подають іншу програму як rename
, і ця програма тут не корисна).
rename 's/ /_/g' *
Обов’язкове рішення zsh:
autoload zmv
zmv '(*)' '${1// /_}'
Обов’язкове рішення POSIX:
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
s/…/…/g
означає замінити всі події. Це не дуже добре пояснено в посібнику . Якщо ви хочете перейменувати каталоги, є способи, будь ласка, знайдіть його (я думаю, я це бачив і раніше), і якщо ви не можете його знайти, задайте нове запитання.
_MG_blah.JPG
на IMG_blah.JPG
.
Ви можете використовувати rename
для цього (якщо припустити той util-linux
, а не той perl
):
cd /path/to/dir
rename ' ' _ *\ *
Це знайде для всіх файлів та каталогів простір в імені та замінить пробіл підкресленням. Оскільки він використовує глобальний збіг файлів, для початку вам потрібно бути у правильному каталозі.
Якщо ви хочете робити рекурсивні збіги, ви можете, але вам, можливо, доведеться виконати rename
пару разів, щоб зловити будь-які елементи в каталогах, які самі перейменовані:
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
rename
Перейменуватимуть вказані файли, замінивши перше входження з їхнього імені на на ". Отже, це буде працювати лише для файлів з одним пробілом у їх імені. (Ви можете зателефонувати rename
в циклі, але це насправді не правильний інструмент.)
Інший варіант буде mmv
, якщо він встановлений.
mmv \*\ \* \#1_#2
_
, він не працює іменами з кількома пробілами.
У Debian / Ubuntu, спираючись на відповіді Калеба і Жиля, саме це працювало для мене, щоб перейменовувати файли рекурсивно:
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
Примітка. Щоб переглянути, які файли будуть перейменовані та як, використовуйте -n
перемикач за допомогою rename
:
rename -n 's/ /_/g' **
Ще одна примітка: налаштування globstar
створює **
файли відповідності у всіх підкаталогах, тому, якщо бажано лише поточний каталог, не встановлюйте globstar або використовуйте *
замість нього **
.
Ще одна примітка: rename
Команду потрібно запускати не один раз для файлів з кількома зустрічами пошукового терміну.
a b/c d
щоб a_b/c_d
працювати не буде, вам потрібно спочатку перейменувати a b/c d
в a b/c_d
, а потім a b
в a_b
).
rename
команду двічі?
**
виключає точкові файли та переходи символів.
Якщо ви не флеш в регулярних виразах (я ні!), І ви можете запускати програми, розроблені для kde (або ви використовуєте робочий стіл kde - k, або у вас встановлені бібліотеки), то krename - це чудова графічна утиліта, яка дозволяє вам бачити раніше і після того, як ви почнете зміни. Він має ряд простих перетворень як опцій, а також підтримує регулярні вирази. Ви навіть можете об'єднати кілька послідовних перетворень в одне перейменування, щоб не потрібно було розробити єдине складне перетворення, яке робить це все одночасно. Він також має можливість продовжити перейменування тих самих файлів після того, як буде застосовано перейменування.
Я не використовую його часто, але коли я це роблю, він дійсно швидко і легко виконує роботу. Це дійсно корисно при перейменуванні різних завантажених мультимедійних файлів, щоб ви могли одночасно керувати ними у вашій системі. Це допомагає завантажити посібник з krename окремо, щоб ви могли посилатися на нього під час використання програми.
find -maxdepth 1
б виконати саме те, що ОП запитало про роботу в поточній папці.