У меня есть несколько файлов в папке, и я хочу заменить каждый символ пробела во всех именах файлов символами подчеркивания. Как я могу достичь этого?
Linux - Замена пробелов в именах файлов
Ответ 1
Это должно сделать это:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
Ответ 2
Я предпочитаю использовать команду "rename", которая принимает регулярные выражения в стиле Perl:
rename "s/ /_/g" *
Вы можете выполнить сухой пробег с флагом -n:
rename -n "s/ /_/g" *
Ответ 3
Использовать sh...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
Если вы хотите попробовать это, прежде чем потянуть курок, просто измените mv
на echo mv
.
Ответ 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
Ответ 5
Если вы используете bash:
for file in *; do mv "$file" ${file// /_}; done
Ответ 6
Попробуйте что-нибудь подобное, считая, что все ваши файлы были .txt's:
for files in *.txt; do mv "$files" `echo $files | tr ‘ ‘ ‘_’`; done
Ответ 7
Введите свои переменные:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Удалите "эхо" для фактического переименования.
Ответ 8
Я считаю, что ваш ответ находится в Заменить пробелы в именах файлов с символами подчеркивания.
Ответ 9
Самый простой способ заменить строку (символ пробела в вашем случае) другой строкой в Linux
использует sed
. Вы можете сделать это следующим образом
sed -i 's/\s/_/g' *
Надеюсь, что это поможет.
Ответ 10
Я пытаюсь запустить это как script https://hastebin.com/xemitireri.bash,
#!/bin/bash
# https://stackoverflow.com/info/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:./Disk 03: нет такого файла или каталога