Массовое переименование файлов

Автор infernos1, 06 октября 2015, 20:31:21

« назад - далее »

0 Пользователи и 5 гостей просматривают эту тему.

infernos1

Доброго всем дня, подскажите пожалуйста как решить данный вопрос.
Имеется raid раздел размером 6тб, на нем заполнено файлами и папками около 5тб.
Файлов много, в каждой папке по 10-20 отчетов, папок около 25000.
Нужно по опредленному шаблону прогнать эти файлы и убрать из их имен
" , ",
Чем такое можно провернуть?

alsoijw

infernos1, sed -ом можно вырезать что-то из текста. Подставить вывод одной команды как аргумент другой взяв команду в ``. Сменить имя можно с помощью mv. Выбрать все файлы find
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

infernos1

Цитата: alsoijw от 06 октября 2015, 20:57:17infernos1, sed -ом можно вырезать что-то из текста. Подставить вывод одной команды как аргумент другой взяв команду в ``. Сменить имя можно с помощью mv. Выбрать все файлы find
А хоть пример не покажете? пожалуйста.
Я не очень понимаю :(

yura_n

#3
Цитата: infernos1 от 06 октября 2015, 20:31:21Чем такое можно провернуть?
Не думаю, что существует какое-то простое решение, там до кучи еще и пробелы... надо парсить имена файлов, с удалением ненужного. Я бы напитонил скрипт для этого.

infernos1

Цитата: yura_n от 06 октября 2015, 21:22:30напитонил
Красиво звучит, н ок сожалению у меня знание debian на уровне apt-get install

endru

Цитата: infernos1 от 06 октября 2015, 21:25:55у меня знание debian на уровне apt-get install
учи команды. нужные тебе подсказали. вот подсказка find - поиск файлов - памятка по команде

alsoijw

Цитата: infernos1 от 06 октября 2015, 21:01:19А хоть пример не покажете? пожалуйста.
Я не очень понимаю :(
Не идеальный код, но я пока лучше не умею :(
files="`find`"
for file in $files
do
mv "$file" "`echo $file" | sed "s/&quot ; , ",//g"`"
done
Вроде ничего не перепутал.
yura_n, питон это явно не оптимальное решение.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

endru

alsoijw, без экранирования спецсимволов (пробелы тоже к ним относятся) работать не будет. да и find что будет искать? в какой директории? или будет перебирать все системные файлы?

yura_n

Цитата: alsoijw от 07 октября 2015, 13:37:02yura_n, питон это явно не оптимальное решение.
Ну это как сказать. Здесь присутствуют символы '&' и ';' , которые в именах файлов очень, очень использовать нежелательно. Плюс пробел, который хоть и можно использовать, но он добавляет проблем. На мой взгляд, работа именно как со строкой, а не как с именем файла здесь удобнее.

alsoijw

endru, ты имеешь в виду sed работать не будет? Работает.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

endru

alsoijw, т.е. есть на практике применение данного велосипеда?
ок. не поленился воссоздать картину. на примере 1 пробела в файле:
$ ls
123 032.txt
$ files=`find ./ -type f`;for file in $files;do echo $file;done
./123
032.txt

на первом этапе скрипта мы получили проблему не существующих файлов, виноват пробел.
почему нельзя воспользоваться стандартными решениями и сделать все одной командой?
$ ls
123 032.txt
$ find ./ -type f -exec rename 's/3\ 0//g' {} \;
$ ls
1232.txt

а экранирование - это очень полезное правило, результат действий становится более предсказуем:
$ ls
123 $ 032.txt
$ find ./ -type f -exec rename 's/3 $ 0/30/g' {} \;
$ ls
123 $ 032.txt
$ find ./ -type f -exec rename 's/3\ \$\ 0/30/g' {} \;
$ ls
123032.txt