it-roy-ru.com

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

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

82
Mithun Sreedharan

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

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

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

rename "s/ /_/g" *

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

rename -n "s/ /_/g" *
59
DF.

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

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

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

11
DigitalRoss

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

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

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

for file in *; do mv "$file" ${file// /_}; done
3
Murali VP

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

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

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

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

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

1
Desta Haileselassie Hagos

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

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

Удалите "echo", чтобы сделать реальное переименование.

1
ghostdog74

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

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

Чтобы переименовать все файлы с расширением .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
0
akilesh raj