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


Відповіді:


172

Це має зробити це:

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

Це не спрацювало для мене. Він стверджував, що існують однакові файли (з неправильними назвами файлів). Наприклад, намагаючись перейменувати, 1 - foo.jpgі моя папка вже була 1.jpgв ній.
byxor

3
Мені важко читати зворотні посилання, коли вони поруч із цитатами. Те саме, але більш читабельне було бfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Примітка. Це запускається з ВНУТРИ каталогу, назви файлів яких потрібно оновити. Крім того, ви можете змінити *на PATH_TO_YOUR_DIRECTORY.
CFitz

72

Я вважаю за краще використовувати команду 'rename', яка приймає регулярні вирази в стилі Perl:

rename "s/ /_/g" *

Ви можете зробити сухий запуск із позначкою -n:

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

3
це спрацює, якщо у вас є перейменування у стилі perl, а не простіше - Redhat / Fedora
Девід Дін,

9
версія Fedora будеrename " " "_" *
Девід Дін

4
renameнедоступно в OSX, здається.
Etienne Low-Décarie

На MacOS 10.12.3 renameдоступний.
Сон Чо Чо

1
@DavidDean Перейменування на Arch Linux замінить лише перше входження (не дуже зручно для файлів / каталогів із кількома пробілами). Він має такий самий синтаксис, як і Fedora, тому я підозрюю, що вони можуть бути однаковими. Але perl-rename можна встановити.
prosoitos

15

Використовуйте ш ...

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

Якщо ви хочете спробувати це, перш ніж натискати на курок, просто змініть mvна echo mv.


4

Якщо ви використовуєте bash:

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

коли я намагався, я отримав mv: при переміщенні декількох файлів останнім аргументом повинен бути каталог. Спробуйте mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'для отримання додаткової інформації.
Mithun Sreedharan

Знову помилка mv: аргумент відсутнього файлу Спробуйте mv --help' for more information. mv: missing file argument Try mv --help 'для отримання додаткової інформації. mv: аргумент відсутнього файлу Спробуйте mv --help' for more information. mv: missing file argument Try mv --help 'для отримання додаткової інформації.
Mithun Sreedharan

@ levislevis85: Thx, не знав цього.
soulmerge

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

2

Спробуйте щось подібне, припустивши, що всі ваші файли були .txt:

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

2
отримав нижченаведену помилку tr: при перекладі mv: аргумент відсутнього файлу потрібно вказати два рядки Спробуйте `mv --help 'для отримання додаткової інформації.
Mithun Sreedharan

2
Помилка Agin tr: занадто багато аргументів Спробуйте tr --help' for more information. mv: missing file argument Try mv --help 'для отримання додаткової інформації.
Mithun Sreedharan

2

Ось ще одне рішення:

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

1

Процитуйте свої змінні:

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

Видаліть "ехо", щоб зробити фактичне перейменування.


Це повторює команди mv prperly, але насправді не перейменовує файл!
Mithun Sreedharan

видалення луни видає помилку, подібну до mv: неможливо \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat стати \ '1130_1_bedroom_floor_plan.jpg \' ': Немає такого файлу або каталогу mv: не може \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat стати \' 1130_diningroom_table.jpg \ '': Немає такого файлу або каталогу
Мітхун Срідгаран

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP пт 14 серпня 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

Найпростіший спосіб замінити рядок (пробіл у вашому випадку) іншим рядком у Linux- за допомогою sed. Ви можете зробити це наступним чином

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

Сподіваюся, це допомагає.


Це не стосується питання.
аміт


0

Щоб перейменувати всі файли із .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.