Linux - Замена пробелов в именах файлов - PullRequest
82 голосов
/ 27 ноября 2009

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

Ответы [ 11 ]

144 голосов
/ 27 ноября 2009

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

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
59 голосов
/ 27 ноября 2009

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

rename "s/ /_/g" *

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

rename -n "s/ /_/g" *
11 голосов
/ 27 ноября 2009

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

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

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

4 голосов
/ 03 апреля 2010

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

Ну, я только что нашел ответ сам. Не самое элегантное решение (пытается переименовать также файлы, которые не соответствуют условию), но работает. (Кстати, в моем случае мне нужно было переименовать файлы с «% 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
3 голосов
/ 27 ноября 2009

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

for file in *; do mv "$file" ${file// /_}; done
1 голос
/ 09 ноября 2018

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

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

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

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

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

1 голос
/ 27 ноября 2009

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

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

Удалите «echo» для фактического переименования.

1 голос
/ 27 ноября 2009

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
0 голосов
/ 07 апреля 2018

Чтобы переименовать все файлы с расширением .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...