Відповіді:
Якщо вам також потрібно перейменовувати файли у підкаталогах, а ваш 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б виконати саме те, що ОП запитало про роботу в поточній папці.