Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

Удалите "эхо" для фактического переименования.

Ответ 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: нет такого файла или каталога