У меня есть несколько файлов в папке, и я хочу заменить каждый пробел во всех именах файлов символами подчеркивания. Как я могу это достичь?Linux - Замена пробелов в именах файлов
ответ
Это следует сделать это:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
Я считаю, что ваш ответ такой: Replace spaces in filenames with underscores.
Хотя это теоретически может ответить на вопрос, [было бы предпочтительно] (http://meta.stackexchange.com/q/8259) включить основные части ответа здесь , и предоставить ссылку для справки. –
Попробуйте что-то вроде этого, предполагая, что все файлы были .txt годы:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
получил ошибку ниже tr: при переводе необходимо указать две строки: mv: отсутствующий аргумент файла Попробуйте 'mv --help 'для получения дополнительной информации. –
Ошибка Agin tr: слишком много аргументов Попробуйте 'tr --help 'для получения дополнительной информации. mv: отсутствующий аргумент файла Попробуйте 'mv --help 'для получения дополнительной информации. –
Если вы используете Баш:
for file in *; do mv "$file" ${file// /_}; done
когда я пытался, я получил mv: при перемещении нескольких файлов последний аргумент должен быть каталогом Попробуйте 'mv --help 'для получения дополнительной информации. mv: при перемещении нескольких файлов последний аргумент должен быть каталогом Попробуйте 'mv --help 'для получения дополнительной информации. –
Должно быть '$ {FILE// _}' – soulmerge
, которые заменяют только 1 пробел – ghostdog74
Использование ш ...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
Если вы хотите попробовать это, прежде чем потянуть курок, просто измените mv
на echo mv
.
Это тоже хорошо работает –
Quote переменные:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Удалите "эхо" для фактического переименования.
Это повторяет команды mv, но не переименовывает файл! –
удаление echo вызывает ошибку, например mv: can not stat '\ '1130 lake micigan view.jpg \' ': Нет такого файла или каталога mv: не могу stat' \' 1130_1_bedroom_floor_plan.jpg \ '': Нет такого файла или каталога mv: не может stat '\ '1130_BedPicture_8.jpg \' ': Нет такого файла или каталога mv: не может stat' \' 1130_diningroom_table.jpg \ '': Нет такого файла или каталога –
что такое ваша ОС? – ghostdog74
Я предпочитаю использовать команду 'переименовывать', который принимает регулярные выражения Perl-стиль:
rename "s/ /_/g" *
Вы можете сделать всухую с флагом -n:
rename -n "s/ /_/g" *
это будет работать * если * у вас есть переименование стиля perl, а не более простой redhat/fedora one –
версия fedora будет «переименовывать» «» _ »*' –
'rename' недоступно в OSX. –
Что делать, если вас хотите применить задачу замены рекурсивно? Как бы Вы это сделали?
Ну, я сам нашел ответ. Нет самого элегантного решения (пытается переименовать файлы, которые не соответствуют условию), но работает. (Кстати, в моем случае мне нужно переименовать файлы с «% 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
Самым простым способом заменить строку (пробел в вашем случае) с другой строкой в Linux
является используя sed
. Вы можете сделать это следующим образом:
sed -i 's/\s/_/g' *
Надеюсь, это поможет.
Я пытаюсь запустить это как сценарий https://hastebin.com/xemitireri.bash,
#!/bin/bash
# https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names
find . -type d | while read N
do
(
cd "$N"
if test "$?" = "0"
then
for file in *; do mv "$file" ${file// /_}; done
fi
)
done
Я хочу, чтобы запустить этот рекурсивно, по одной папке, которая имеет несколько папок в нем, каждый из которых имеет несколько файлов в них. И имена папок, и имена файлов имеют пробелы в них (например, для запуска в папке «Тестирование», которая содержит «Хороший альбом», который содержит «Диск 1», «Диск 2» и т. Д. В папке каждого диска есть «Песня 1 .txt "," Song 2.txt "," Song 3.txt и т. д.). Этот DID переименовывает папки, но не файлы внутри папок. Я получаю сообщение об ошибке bash: cd: ./Disk 02: Нет такого файла или каталога bash: cd: ./Disk 01: Нет такого файла или каталога bash: cd:./ Диск 03: Нет такого файла или каталога
Это не ответ, а другой вопрос. Рассмотрите возможность открытия нового вопроса. – Fabien
Это не сработало для меня. Он утверждал, что существуют идентичные файлы (с неправильными именами файлов). Например. пытаясь переименовать '1 - foo.jpg', а в моей папке уже есть' 1.jpg'. – byxor