проблемы безопасности при установке из исходного кода от имени root

На этом рисунке представлен символ, значение Unicode которого равно 000A (в шестнадцатеричном формате). Это символ перевода строки (LF) , то есть разрыв строки.

Linux допускает разрывы строк в именах файлов, но это очень необычно. Можно обрабатывать имена файлов с разрывами строк в сценариях оболочки, но вам нужно быть особенно осторожным. Ваш сценарий анализирует вывод find , и, поскольку этот вывод использует символы новой строки для разделения элементов, этот метод по сути не может обрабатывать новые строки в именах файлов.

Ваш сценарий намного сложнее, чем должен быть. Если вы все упростите, это сработает. Как правило, действуйте с данными, когда они у вас есть, вместо того, чтобы упаковывать все в текстовый поток и повторно анализировать его.

С помощью find не анализировать вывод. Используйте действие -exec .

Самый простой способ сделать это переименование (я заменю символы новой строки пробелами) - использовать zsh , благодаря его функции zmv .

autoload -U zmv   # put this in your .zshrc
cd $working_dir
zmv '**/*' $'${f//\n/ }'

Если вам действительно нужно придерживаться программ, которые всегда предустановлены на невстроенном Linux, вот простой (хотя и несколько медленный) метод, который использует bash для переименования:

find "$working_dir" -type f -name '*
*' -exec bash -c 'mv "$0" "${0//
/ }"' {} \;

Вы можете ускорить это, вызвав bash для пакетов файлов:

find "$working_dir" -type f -name '
' -exec bash -c 'for x; do mv "$x" "${x//
/ }"' _ {} +

Если есть одна новая строка, в Linux вы можете использовать команду rename (в Debian и производных версиях она называется rename.ul ).

find "$working_dir" -type f -name '
' -exec rename '
' ' ' {} +

Если у вас есть prename :

find "$working_dir" -type f -name '
' -exec prename 'y/\n/ /' {} +

2
13.02.2016, 16:41
0 ответов

Теги

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