Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: bash, работа с именами файлов  (Прочитано 7736 раз)

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

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #15 : 02 Июня 2016, 17:07:37 »
EvangelionDeath,
Да, но зато файлы не будут затерты как в варианте от Azure.
Т.к при переименовании:
mv "/путь/имя_файла" "/путь/новое_обрезаное_имя_файла"файл "/путь/новое_обрезаное_имя_файла" если он уже существовал, будет затерт.
Да, но количество переборов тоже как бы с каждым разом будет все расти и расти. Чуть выше исправил скрипт azure, и кроме того, как я писал, лучше использовать скозное нумерование, а не сбрасывать счетчик постоянно. При свозном шанс попасть на уже занятое имя куда меньше
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #16 : 02 Июня 2016, 17:35:18 »
Цитировать
Да, но количество переборов тоже как бы с каждым разом будет все расти и расти.
переборов чего?

Цитировать
Чуть выше исправил скрипт azure
Файлы будут перезаписыватся. А поможет только ключ -n,
но потом нужно будет непереименованные файлы вручную переименовывать.

Цитировать
лучше использовать скозное нумерование, а не сбрасывать счетчик постоянно. При свозном шанс попасть на уже занятое имя куда меньше
Нет, не лучше, т.к. в каждой папке номер в имени будет начинатся не с 2, а с какого-то неизвестного числа.

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #17 : 02 Июня 2016, 17:59:44 »
переборов чего?
переборов вариантов имени. могу подcказку дать 0, 0, 1, 2, 3...

Цитировать
Файлы будут перезаписыватся. А поможет только ключ -n,
но потом нужно будет непереименованные файлы вручную переименовывать.
really? уже второй раз, проверяйте вначале, прежде чем что-то утверждать
Цитировать
Нет, не лучше, т.к. в каждой папке номер в имени будет начинатся не с 2, а с какого-то неизвестного числа.
1) Зато имя будет начинатся так как оно начиналось с самого начала
2) именование с конца файла это куда лучше. особенно что-то вида 1050DVD.SUB.avi или 201920x1080.jpeg - ну очень понятные названия
« Последнее редактирование: 02 Июня 2016, 18:01:49 от EvangelionDeath »
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #18 : 02 Июня 2016, 18:34:09 »
EvangelionDeath,
Цитировать
переборов вариантов имени.
Нет не будет.

Цитировать
1) Зато имя будет начинатся так как оно начиналось с самого начала
С номера файла в какой-то директории, в которой перед переименованием файл был уже найден - это не начало.

Цитировать
2) именование с конца файла это куда лучше. особенно что-то вида 1050DVD.SUB.avi или 201920x1080.jpeg - ну очень понятные названия
Как вариант: $N$NFN заменить на $N_$NFN

Пользователь добавил сообщение 02 Июня 2016, 18:56:02:
Цитировать
Код: (bash) [Выделить]
for file in `find $1 -type f` ; do
Без IFS=$'\n' строки с пробелами будут разделены по пробелам на отдельные аргументы цикла.
« Последнее редактирование: 02 Июня 2016, 18:56:02 от Cxms »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #19 : 02 Июня 2016, 18:57:50 »
переборов вариантов имени.
Нет не будет.

(Нажмите, чтобы показать/скрыть)

(Нажмите, чтобы показать/скрыть)

Ну + еще и сравним длину имен файлов. Задача выполнена? НЕТ!

Цитировать
С номера файла в какой-то директории, в которой перед переименованием файл был уже найден - это не начало.

Вы дальше продолжаете? Не видел, но осуждаю. Есть два мнения: мое и неправильное. Я Вас правильно понял?

Цитировать
Как вариант: $N$NFN заменить на $N_$NFN

Поменяем шило на мыло. 1050_DVD.SUB.avi или 20_1920x1080.jpeg - сразу все стало ясно!

Что бы я не игрался особо опять: результат работы скрипта Azure + коррективы
(Нажмите, чтобы показать/скрыть)
(Нажмите, чтобы показать/скрыть)


Пользователь добавил сообщение 02 Июня 2016, 19:02:38:
А за IFS спасибо. внес исправление
« Последнее редактирование: 02 Июня 2016, 19:05:30 от EvangelionDeath »
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #20 : 02 Июня 2016, 20:00:29 »
Если файла не существует - то и переборов не будет. :)

Цитировать
1050_DVD.SUB.avi или 20_1920x1080.jpeg - сразу все стало ясно!
Да читабельнее и проще, и в моем варианте отрезается лишнее не с конца до точки, а с начала.

Еще в вашем варианте и от Azure будут не правильно обрабатыватся файлы только с точкой в начале:
IFS=$'\n'; fname='.Abcdef абв 123'; tmp=${fname%.*}; ext=${fname#$tmp}; echo $tmp; echo $ext
« Последнее редактирование: 02 Июня 2016, 20:03:04 от Cxms »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #21 : 02 Июня 2016, 20:15:23 »
Cxms,
Цитировать
Если файла не существует - то и переборов не будет.
все началось из-за того, что вы начали говорить о перезаписи)
Цитировать
Да читабельнее и проще, и в моем варианте отрезается лишнее не с конца до точки, а с начала.
Ну да, значительно проще.
Был файл Game.of.Thrones.s0p1.720p.avi стало s0p1.720p.avi - ну теперь точно ясно что это за фильм! вместо Game.of.T1.avi

Цитировать
Еще в вашем варианте и от Azure будут не правильно обрабатыватся файлы только с точкой в начале:
а в вашем правильно? в нашем выводит эксепшн, думаю это можно исправить с помощью условия) А в вашем вместо скрытого файла получаем непонятно что =)

HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #22 : 02 Июня 2016, 21:04:00 »
Цитировать
все началось из-за того, что вы начали говорить о перезаписи)
А что, у вас
mv "exist_file1" "exist_file2"не перезаписывает(затирает) "exist_file2"?

Цитировать
а в вашем правильно? в нашем выводит эксепшн
Что не правильно? Скрипт работает, где там у вас эксепшн?

Цитировать
А в вашем вместо скрытого файла получаем непонятно что
Без точки.

Еще баг: если длина расширения больше len:
IFS=$'\n'; len=12; file='/path/to/Abcdef абв 123.abcdefgabcdefg'; fname=`basename $file`; tmp=${fname%.*}; ext=${fname#$tmp}; dest="${file%$fname}${tmp::$(($len-${#ext}))}$ext"; echo "$dest"решение:
[ ${#ext} -gt $len ] && continue
« Последнее редактирование: 02 Июня 2016, 21:06:13 от Cxms »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #23 : 02 Июня 2016, 21:10:52 »
Cxms, нет. Не перезаписывает. Оно ищет доступное имя для файла. Повторяю еще раз, проверяйте вначале.

Если желаемая длина файла меньше длины и длины расширения или скрытого файла без разширения

Знаете разницу между файлами с точкой и без точки вначале?
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #24 : 02 Июня 2016, 21:25:18 »
Девочки, не ссорьтесь. Вариантов написания очень много, предусмотреть их все невозможно. Остается только стремится к совершенству. Надеюсь ТС оценит формат имен файлов которые он собирается переименовывать.
Что касаетсяfor file in `find $1 -type f` ; doэто вообще неправильная конструкция в принципе. Для корректной обработки следует использоватьwhile read file ; do … ; done < <(find -type f)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #25 : 02 Июня 2016, 21:32:13 »
Azure, я и не ссорюсь. Адекватно воспринимаю критику и замечания, вношу правки в код.

Оппонент немного не понимает о чем ему говорят, а я обяснить не могу.

Вспоминается шутка, если бы разработчики офтопика создалтёи бы офтопик идеальным, то миллионы программистов осталось бы без работы.

Ну и жизненный цикл по подразумевает правки и усовершенствование кода без потери функциональных возможностей
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн wolfser2701

  • Забанен
  • Участник
  • *
  • Сообщений: 180
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #26 : 02 Июня 2016, 22:12:53 »
Azure,
Цитировать
while read file ; do … ; done < <(find -type f)
Вот я точно тупой (не айтишник), читаю просто по приколу  --->  читать файл до тех пор, пока - do _ не понял, а это вообче (объяснять не нуно )  ---> done < <(find -type (это как в форте обратная польская запись, или точнее я полный лохобан)  :idiot2:     ;D

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #27 : 02 Июня 2016, 22:23:34 »
Цитировать
Cxms, нет. Не перезаписывает. Оно ищет доступное имя для файла. Повторяю еще раз, проверяйте вначале.
Перезаписывает. А что там ищет или неищет mv невидно, но если файл2 существует - он затерается файлом1.

Цитировать
Если желаемая длина файла меньше длины и длины расширения или скрытого файла без разширения
Да, но проблема скрытого файла без разширения остается.
Можно решить так:
[ ${#tmp} = 0 ] && { tmp=".$fname"; ext=""; }
Azure,
Цитировать
Что касается
for file in `find $1 -type f` ; doэто вообще неправильная конструкция в принципе. Для корректной обработки следует использовать
while read file ; do … ; done < <(find -type f)
А что неправильного? С пробелами работает корректно, и с пец. символами тоже.
Циклы с while read не использую, потому что в них не сохраняются значения переменных, после завершения цикла.
« Последнее редактирование: 02 Июня 2016, 22:26:27 от Cxms »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #28 : 02 Июня 2016, 22:35:31 »
Cxms, мде. Я пытался объяснить, но увы. Вспоминая фразу одного антогониста старого Final Fantasy. Spirits Within "Where is proof?" (Где доказательства). Я же говорю, что не перезапишет и дал листинги с исходными именами и результатами работы

Код: (bash) [Выделить]
if [ -f $dest ]; then
    while [ -f "${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext" ]; do let add+=1; done
    ...
else
    ...
fi
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн wolfser2701

  • Забанен
  • Участник
  • *
  • Сообщений: 180
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #29 : 02 Июня 2016, 22:42:11 »
EvangelionDeath, Ну ты приколист, почти всё понял, а это нет.   $(($len-${#ext}-${#add}))}$add$ext" , куча переменных?

 

Страница сгенерирована за 0.068 секунд. Запросов: 23.