Linux - Замена пробелов в именах файлов

96

У меня есть несколько файлов в папке, и я хочу заменить каждый пробел во всех именах файлов символами подчеркивания. Как я могу этого добиться?

Митхун Сридхаран
источник

Ответы:

172

Это должно сделать это:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
Neesh
источник
У меня это не сработало. Он утверждал, что существуют идентичные файлы (с неправильными именами). Например, при попытке переименования 1 - foo.jpgмоя папка уже была 1.jpgв ней.
byxor
3
Мне трудно читать обратные кавычки, когда они находятся рядом с кавычками. То же самое, но более читаемоеfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron
Примечание. Это запускается ВНУТРИ каталога, имена файлов которого вы хотите обновить. Кроме того, вы можете изменить его *на PATH_TO_YOUR_DIRECTORY.
CFitz 08
73

Я предпочитаю использовать команду rename, которая принимает регулярные выражения в стиле Perl:

rename "s/ /_/g" *

Вы можете выполнить пробный прогон с флагом -n:

rename -n "s/ /_/g" *
DF.
источник
3
это сработает, если у вас есть переименование в стиле Perl, а не более простое в стиле redhat / fedora
Дэвид Дин
9
версия Fedora будетrename " " "_" *
Дэвид Дин
4
renameпохоже, недоступно в OSX.
Этьен Лоу-Декари
В macOS 10.12.3 renameдоступно.
Сунг Чо
1
@DavidDean Переименование в Arch Linux заменит только первое вхождение (не очень удобно для файлов / каталогов с несколькими пробелами). Он имеет тот же синтаксис, что и Fedora, поэтому я подозреваю, что они могут быть одинаковыми. Но можно установить perl-rename.
prosoitos
15

Используйте ш ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Если вы хотите попробовать это перед тем, как нажать на курок, просто измените mvна echo mv.

DigitalRoss
источник
4

Если вы используете bash:

for file in *; do mv "$file" ${file// /_}; done
Мурали В.П.
источник
Когда я попробовал, у меня получилось mv: при перемещении нескольких файлов последний аргумент должен быть каталогом. Попробуйте mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'для получения дополнительной информации.
Mithun Sreedharan
Снова ошибка mv: отсутствует аргумент файла. mv --help' for more information. mv: missing file argument Try Для получения дополнительной информации попробуйте mv --help '. mv: отсутствует аргумент файла. mv --help' for more information. mv: missing file argument Try Для получения дополнительной информации попробуйте mv --help '.
Mithun Sreedharan
@ levislevis85: Спасибо, не знал этого.
soulmerge
4

Что делать, если вы хотите применить задачу замены рекурсивно ? Как бы Вы это сделали?

Ну я только что сам нашел ответ. Не самое элегантное решение (также пытается переименовать файлы, которые не соответствуют условию), но оно работает. (Кстати, в моем случае мне нужно было переименовать файлы с помощью "% 20", а не с подчеркиванием)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done
Джавипас
источник
2

Попробуйте что-нибудь подобное, предполагая, что все ваши файлы были .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Амир Афгани
источник
2
получил следующую ошибку tr: при переводе mv: missing file argument должны быть указаны две строки. Для получения дополнительной информации попробуйте `mv --help '.
Mithun Sreedharan
2
Начальная ошибка tr: слишком много аргументов. tr --help' for more information. mv: missing file argument Try Для получения дополнительной информации попробуйте mv --help '.
Mithun Sreedharan
2

Вот еще одно решение:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. использует awk для добавления кавычек вокруг имени файла
  2. использует sed для замены пробела символами подчеркивания; печатает исходное имя в кавычках (из awk); затем подставленное имя
  3. xargs берет 2 строки за раз и передает их mv
yoogottamk
источник
1

Цитируйте свои переменные:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Удалите «эхо», чтобы выполнить фактическое переименование.

призрачная собака74
источник
Предположительно, он повторяет команды mv, но не переименовывает файл!
Mithun Sreedharan
удаление эха вызывает ошибку, например mv: cannot stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Нет такого файла или каталога mv: cannot stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Нет такого файла или каталога
Mithun Sreedharan
Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Пт, 14 августа, 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Митхун Сридхаран
1

Самый простой способ заменить строку (пробел в вашем случае) другой строкой Linux- использовать sed. Вы можете сделать это следующим образом

sed -i 's/\s/_/g' *

Надеюсь это поможет.

Деста Хейлеселассие Хагос
источник
Это не решает вопрос.
amit
0

Я считаю, что ваш ответ находится в разделе "Замените пробелы в именах файлов символами подчеркивания" .

Артур Франкель
источник
1
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Bill the Lizard
0

Чтобы переименовать все файлы с .pyрасширением, используйте find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Пример вывода,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
Акилеш Радж
источник