У мене є декілька файлів у папці, і я хочу замінити кожен пробіл у всіх іменах файлів на підкреслення. Як я можу цього досягти?
У мене є декілька файлів у папці, і я хочу замінити кожен пробіл у всіх іменах файлів на підкреслення. Як я можу цього досягти?
Відповіді:
Це має зробити це:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
*
на PATH_TO_YOUR_DIRECTORY
.
Я вважаю за краще використовувати команду 'rename', яка приймає регулярні вирази в стилі Perl:
rename "s/ /_/g" *
Ви можете зробити сухий запуск із позначкою -n:
rename -n "s/ /_/g" *
rename " " "_" *
rename
недоступно в OSX, здається.
rename
доступний.
Використовуйте ш ...
for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done
Якщо ви хочете спробувати це, перш ніж натискати на курок, просто змініть mv
на echo mv
.
Якщо ви використовуєте bash:
for file in *; do mv "$file" ${file// /_}; done
mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try
mv --help 'для отримання додаткової інформації.
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 'для отримання додаткової інформації.
Що робити, якщо ви хочете застосувати завдання заміни рекурсивно ? Як би ти це зробив?
Ну, я просто сам знайшов відповідь. Не найелегантніше рішення (також намагається перейменувати файли, що не відповідають умові), але воно працює. (До речі, у моєму випадку мені потрібно було перейменувати файли на '% 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
Спробуйте щось подібне, припустивши, що всі ваші файли були .txt:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
tr --help' for more information. mv: missing file argument Try
mv --help 'для отримання додаткової інформації.
Ось ще одне рішення:
ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
Процитуйте свої змінні:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Видаліть "ехо", щоб зробити фактичне перейменування.
\'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
- за допомогою sed
. Ви можете зробити це наступним чином
sed -i 's/\s/_/g' *
Сподіваюся, це допомагає.
Я вважаю, що ваша відповідь - Замінити пробіли в іменах файлів підкресленнями .
Щоб перейменувати всі файли із .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
1 - foo.jpg
і моя папка вже була1.jpg
в ній.