Как исключить из обработки файлы со слишком длинными именами?

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модератор: SLEDopit

Mrakobes
Сообщения: 54
ОС: WinXP_SP3/Linux-Debian-Lenny

Как исключить из обработки файлы со слишком длинными именами?

Сообщение Mrakobes »

Доброго времени суток всем!
Делаю на bash сценарий бекапа, который должен собирать файлы с виндовых машин и скидывать на облако.

Проблема такая: поскольку машины виндовые, иногда встречаются файлы с длиной имени больше 255 байт, на которые NIX очень обижается, а davfs и вовсе падает...

Вопрос: как бы мне отловить такие файлы и включить в exclude у rsync?

Конструкция вида:

Код: Выделить всё

             
exclList=""
         for exclSect in $(find путь_к_папке | egrep '/[^/]{130,}$' )
         do
		if ! [ "x$exclSect" -eq "$exclSect" ]
                then
			exclList+=" --exclude "$exclSect
               fi
	done
вполне ожидаемо дробит имена файлов в кашу, поскольку в них пробелы...
А умнее я никак не придумаю.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение Bizdelnick »

Mrakobes писал(а):
23.10.2018 16:50

Код: Выделить всё

if ! [ "x$exclSect" -eq "$exclSect" ]
Это условие всегда вернёт истину. А чтобы пробел не считался разделителем, надо убрать его из $IFS.
find вообще выводит такие длинные пути полностью? Если нет, то идея заведомо неудачная.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4728
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение SLEDopit »

Mrakobes писал(а):
23.10.2018 16:50
for exclSect in $(find путь_к_папке | egrep '/[^/]{130,}$' )
Не надо так делать. Любой пробел или спецсимвол в имени файла не обработается корректно.
Самое простое, что приходит в голову, это что-то в таком духе:

Код: Выделить всё

find . -name "??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*" -printf ' --exclude "%p"' 
Оно найдет все файлы длиннее 130 символов и сразу напечатает как нужно. А, ну разве что ./ в начале будет. Не помню как rsync к этому отнесется.

ps. Вроде как-то можно не просто 130 вопросов напечатать, а нормальный regex задать, но с ходу не вспомнил, а man читать лень.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение Bizdelnick »

SLEDopit писал(а):
23.10.2018 20:05
Вроде как-то можно не просто 130 вопросов напечатать, а нормальный regex задать, но с ходу не вспомнил, а man читать лень.
-regex
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4728
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение SLEDopit »

Bizdelnick писал:
23.10.2018 20:33
-regex
Ок, уговорил. Таки почитал man. Просто regex'a недостаточно. Дефолтный движок не умеет с {} работать. Нужно так:

Код: Выделить всё

find . -regextype  posix-egrep  -regex ".*/[^/]{130,}" -printf ' --exclude "%p"'
(и оно не в каждой системе так будет работать, т.к. POSIX несовместимо)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Mrakobes
Сообщения: 54
ОС: WinXP_SP3/Linux-Debian-Lenny

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение Mrakobes »

SLEDopit, спасибо огромное!
Как-то не подумал я, что можно просто маской сделать фильтрацию по длине имени...
Маска, она даёт то преимущество, что с ней find вообще не нужен! Вписываем её в --exclude у rsync и говорим, что так и было!
Не эстетично, зато надёжно и практично! )
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17706
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Как исключить из обработки файлы со слишком длинными именами?

Сообщение Bizdelnick »

Mrakobes писал(а):
24.10.2018 12:43
Маска, она даёт то преимущество, что с ней find вообще не нужен! Вписываем её в --exclude у rsync и говорим, что так и было!
Главное, не забудьте её в кавычки заключить, чтобы шелл её не раскрыл раньше rsync.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: