Рекурсивное удаление новой строки в именах файлов

Задания, запущенные из cron, не имеют управляющего tty или дисплея. Я собираюсь предположить, что у вас есть реальные числа вместо MINи HOUR?

Попробуйте добавить опцию -display.

0 15 * * * /usr/bin/mplayer -display localhost.localdomain:0 PATH_TO_THE_FILE > /dev/null 2>&1

Возможно, вам придется настроить аргумент -displayдля вашего конкретного сервера.

1
18.09.2019, 19:44
2 ответа

Использование команды rename, предоставленной util-linux, отличается от того, что указано в ответе, который вы указали. В частности, для этого требуются отдельные аргументы fromи to, а не одна команда замены стиля sed --, отсюда и сообщение об ошибке not enough arguments.

SYNOPSIS
       rename [options] expression replacement file...

Так что в этом случае вам понадобится

find. -name $'*\n*' -exec rename $'\n' ' ' {} \;

См. также:

и для простого сравнения использования

2
27.01.2020, 23:17

Убедитесь, что вы используете один из вариантов renameна основе perl-, иногда называемый prename, а не вариант из util-linux(, иногда называемыйrename.ul).

Вариант из util-linuxнамного более ограничен (, несмотря на то, что он намного новее ), использует другой синтаксис, может заменять только фиксированные строки и не может заменять все вхождения строки.

Здесь я бы использовал варианты perl rename, убедитесь, что вы конвертируете символы новой строки только в именах файлов,а не компоненты каталога, ведущие к ним, и используйте -depthдля обработки листьев перед ветвями.

perlраспознает \nкак символ новой строки, поэтому вам не нужно использовать $'...'в качестве аргумента кода (, хотя это нормально, если вы делаете вопреки тому, что я изначально думал ).

find. -depth -name $'*\n*' -exec rename '
  s{[^/]*\z}{$& =~ y/\n/ /r}e' '{}' +

Или используйте -execdir, если доступно (, хотя это будет запускать по крайней мере один renameв каталоге с файлами с \nв пределах):

find. -depth -name $'*\n*' -execdir rename 'y/\n/ /' {} +

Или вы можете использовать zsh'szmv:

autoload zmv
NL=$'\n'
zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'

(, который, в отличие от подходов, основанных на find-, будет по-прежнему работать, даже если имена файлов содержат последовательности байтов, которые не образуют допустимых символов. Он также отключится без каких-либо действий, если обнаружит конфликт ).

3
27.01.2020, 23:17

Теги

Похожие вопросы