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


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

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

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

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
bash, работа с именами файлов
« : 02 Июня 2016, 10:41:56 »
Подскажите пожалуйста, как узнавать количество символов в имени файла?

PS: в целом необходимо, в указанной директории перебрать все файлы, и те файлы чьи именасодержат символов больше заданного - переименовать взяв их же старые ("длинные" имена, но обрезав с начала на нужное количество символов)...  Но пока не представляю в стороны каких команд копать...

ТС не появлялся на Форуме более полугода по состоянию на 14/07/2019 (последняя явка: 10/04/2017). Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 14 Июля 2019, 01:04:10 от zg_nico »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #1 : 02 Июня 2016, 11:28:46 »
name='my_some_file111111111111.txt'

Определение количества символов:

${#name}

Обрезать:

echo $name | cut -c 1-8


Код: (bash) [Выделить]
#!/bin/bash

for file in `ls -alF | grep '^-' | awk '{print $9}'`; do
    newfile=`echo $file | cut -c 1-12`
    mv $file $newfile
done

Как то так. Может есть и более элегантные решения (кроме того тут не обращалось внимания на расширения файлов)
« Последнее редактирование: 02 Июня 2016, 11:32:45 от 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

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #2 : 02 Июня 2016, 11:44:43 »
СПС !  пригодится...

перебор самих файлов вот такой ещё нашел:
for file in `find "/etc/" -type f`
do
echo ${#file};
done
но, опять же нужен рекурсивный поиск, а она вроде этого не делает... на эту тему пока не гуглил :(

может есть какие команды для вырезания пути и имени файла в bash-e, чтобы не городить циклы из expr index $file / и кучи всего, чего там ещё понадобиться.... 
т.е., например, есть путь: "/dir1/dir2/dir3/dir4/file1.txt"
и сразу из этой строки выводить это, без всяких кувырканий со строкой:
Patch="/dir1/dir2/dir3/dir4"
NameFile="file1.txt"
NameFileNoExp="file1"

а может к каким-то командам терминальным есть флаги, с которыми они выводят именно такие
« Последнее редактирование: 02 Июня 2016, 11:49:10 от trablshuter »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #3 : 02 Июня 2016, 11:56:18 »
Код: (bash) [Выделить]
man dirname
man basename
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

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 14037
  • Xubuntu 18.04
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #4 : 02 Июня 2016, 11:56:46 »
trablshuter,
Есть масса команд для этого. Чтобы вырезать только имя файла можно например использовать команду basename.

basename /dir1/dir2/dir3/dir4/file

выведет

file.

Ну и в предыдущем посте про dirname уже сказали.
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #5 : 02 Июня 2016, 12:05:52 »
dirname
basename
отлично, то о чём и мечтал  ;D
Вот Вам благодАр люди добрые !   :D
« Последнее редактирование: 02 Июня 2016, 12:08:54 от trablshuter »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #6 : 02 Июня 2016, 13:19:59 »
Обрезать:
echo $name | cut -c 1-8
А так хорошо начали:
Определение количества символов:${#name}
;)${name::8}В общем
Код: (bash) [Выделить]
len=16
find -type f -exec bash -c '
    fname=${0##*/}
    [ ${#fname} -gt "$len" ] && {
        tmp=${fname%.*}
        ext=${fname#$tmp}
        echo mv "$0" "${0%$fname}${tmp::$(($len-${#ext}))}$ext"
    }
    ' {} \;
« Последнее редактирование: 02 Июня 2016, 13:37:39 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #7 : 02 Июня 2016, 13:28:07 »
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, работа с именами файлов
« Ответ #8 : 02 Июня 2016, 13:36:19 »
ls -alF | grep '^-' | awk '{print $9}'пффф...
find -type f
cut -c 1-NНе обрезает с начала строку, а выводит подстроку от 1 до N-го символа,
и неправильно работает с русскими символами:
echo -n 'Имя какого-то файла.txt' | cut -c 1-8
Вывести имена файлов и дир. длинее 32 симолов:
find -printf "%f\n" | sed -n '/^.\{32\}/p'
Azure,
файл: "$dname${tmp::$(($len-${#ext}))}$ext"
может уже существовать :D (и не один раз).

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #9 : 02 Июня 2016, 14:13:39 »
Cxms,
(Нажмите, чтобы показать/скрыть)

Напишите скрипт, где все будет "правильно". Просили помощи в написании, а не саму полную реализацию
« Последнее редактирование: 02 Июня 2016, 14:17:06 от 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, работа с именами файлов
« Ответ #10 : 02 Июня 2016, 15:10:12 »
EvangelionDeath,
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 02 Июня 2016, 15:14:40 от Cxms »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #11 : 02 Июня 2016, 15:56:00 »
3. awk '{print substr($0,<from>,<length>)}' - тот-же баг.
И где такой код вы находите? ???
Код: (bash) [Выделить]
awk 'BEGIN{FS=""}{for(i=1;i<len;i++)printf("%s",$i);print $len}' len=8
Пользователь добавил сообщение 02 Июня 2016, 16:00:22:
А если sed я бы использовал более быстрый кодsed 's/./\n/9;P;d'
« Последнее редактирование: 02 Июня 2016, 16:00:22 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #12 : 02 Июня 2016, 16:21:42 »
trablshuter,
Код: (bash) [Выделить]
# Максимальная длина имени файла
MAX_L=20

IFS=$'\n'
for F in $(find "$PWD" -type f)
do
FN="$(basename "$F")"
if [ ${#FN} -gt $MAX_L ]
then
FD="$(dirname "$F")"
# Новое имя файла - MAX_L символов от конца
NFN="$(echo "$FN" | egrep -o ".{$MAX_L}$" | tr -d '\n')"
if [ -f "$FD/$NFN" ]
then
N=2
# Пока файл с таким именем существует - добавляем в начало число от 2 и более
# Но после этого длина становится больше MAX_L символов
while [ -f "$FD/$N$NFN" ]; do let N+=1; done
NFN="$N$NFN"
fi
# Переименовываем файл
mv "$F" "$FD/$NFN"
echo "\"$FN\" переименовано в \"$NFN\""
fi
done

Azure,
Цитировать
sed 's/./\n/9;P;d'
а с конца как?
« Последнее редактирование: 02 Июня 2016, 16:39:13 от Cxms »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: bash, работа с именами файлов
« Ответ #13 : 02 Июня 2016, 16:36:53 »
(Нажмите, чтобы показать/скрыть)
Образец для подражания =)

И с авком не знаю, что у Вас не работает. man locale

Код: (bash) [Выделить]
#!/bin/bash                                                                                                                                                                                     

len=12
add=0
IFS=$'\n'
olddir=''
for file in `find $1 -type f | sort` ; do
    fname=`basename $file`
    [ ${#fname} -gt "$len" ] && {
        tmp=${fname%.*}
        ext=${fname#$tmp}
        dest="${file%$fname}${tmp::$(($len-${#ext}))}$ext"
        if [ -f $dest ]; then
            if [ "$olddir" = `dirname $file` ]; then
                let add+=1
            else
                olddir=`dirname $file`
                add=1
            fi
            while [ -f "${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext" ]; do
                let add+=1;
            done
            mv "$file" "${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext"
            echo "File moved from $file to ${file%$fname}${tmp::$(($len-${#ext}-${#add}))}$add$ext"
        else
            mv "$file" "${file%$fname}${tmp::$(($len-${#ext}))}$ext"
            echo "File moved from $file to ${file%$fname}${tmp::$(($len-${#ext}))}$ext"
        fi
    }   
done

« Последнее редактирование: 02 Июня 2016, 19:24:59 от 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, работа с именами файлов
« Ответ #14 : 02 Июня 2016, 16:54:23 »
EvangelionDeath,
Да, но зато файлы не будут затерты как в варианте от Azure.
Т.к при переименовании:
mv "/путь/имя_файла" "/путь/новое_обрезаное_имя_файла"файл "/путь/новое_обрезаное_имя_файла" если он уже существовал, будет затерт.

 

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