Ответы:
Если вам нужно переименовать файлы и в подкаталогах, и вы 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
, и вы можете избавиться от sort
.
-name '* *'
на -name '*_*'
и изменить "${1// /_}"
на"${1//_/.}"
bash
справочной странице.
В любой оболочке вы можете перебирать файлы, имя которых содержит пробел. Заменить пробелы подчеркиванием легко в bash, ksh и zsh с помощью ${VARIABLE//PATTERN/REPLACEMENT}
конструкции.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
В Debian, Ubuntu и его производных вы можете использовать Perl rename
(другие дистрибутивы поставляются с другой программой rename
, и эта программа здесь не нужна).
rename 's/ /_/g' *
Обязательное зш решение:
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
Переименует указанные файлы, заменив первое вхождение from в их имени на to» . Таким образом, это будет работать только для файлов с одним пробелом в имени. (Вы можете позвонить 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
именно то, что ОП спросил о работе с текущей папкой.