2009-11-27 3 views

ответ

104

Это следует сделать это:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done 
+0

Это не сработало для меня. Он утверждал, что существуют идентичные файлы (с неправильными именами файлов). Например. пытаясь переименовать '1 - foo.jpg', а в моей папке уже есть' 1.jpg'. – byxor

0

Я считаю, что ваш ответ такой: Replace spaces in filenames with underscores.

+1

Хотя это теоретически может ответить на вопрос, [было бы предпочтительно] (http://meta.stackexchange.com/q/8259) включить основные части ответа здесь , и предоставить ссылку для справки. –

1

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done 
+2

получил ошибку ниже tr: при переводе необходимо указать две строки: mv: отсутствующий аргумент файла Попробуйте 'mv --help 'для получения дополнительной информации. –

+2

Ошибка Agin tr: слишком много аргументов Попробуйте 'tr --help 'для получения дополнительной информации. mv: отсутствующий аргумент файла Попробуйте 'mv --help 'для получения дополнительной информации. –

3

Если вы используете Баш:

for file in *; do mv "$file" ${file// /_}; done 
+0

когда я пытался, я получил mv: при перемещении нескольких файлов последний аргумент должен быть каталогом Попробуйте 'mv --help 'для получения дополнительной информации. mv: при перемещении нескольких файлов последний аргумент должен быть каталогом Попробуйте 'mv --help 'для получения дополнительной информации. –

+0

Должно быть '$ {FILE// _}' – soulmerge

+0

, которые заменяют только 1 пробел – ghostdog74

7

Использование ш ...

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

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

+0

Это тоже хорошо работает –

1

Quote переменные:

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

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

+0

Это повторяет команды mv, но не переименовывает файл! –

+0

удаление 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 \ '': Нет такого файла или каталога –

+0

что такое ваша ОС? – ghostdog74

40

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

rename "s/ /_/g" * 

Вы можете сделать всухую с флагом -n:

rename -n "s/ /_/g" * 
+0

это будет работать * если * у вас есть переименование стиля perl, а не более простой redhat/fedora one –

+4

версия fedora будет «переименовывать» «» _ »*' –

+3

'rename' недоступно в OSX. –

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 
0

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

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

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

-1

Я пытаюсь запустить это как сценарий 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: Нет такого файла или каталога

+0

Это не ответ, а другой вопрос. Рассмотрите возможность открытия нового вопроса. – Fabien