Здравствуйте, уважаемые форумчане! Помогите с проблемой: наша организация переходит на Astra linux, также сетевая «файлопомойка» NTFS мигрирует на ext4 с сохранением структуры каталогов и их содержимого, однако при миграции возникли проблемы:
1)так как пользователи работают с автоматизированными выгрузками из базы, то часто имена выгрузки бывают длинными 250 символов, что поддерживает NTFS но не поддерживает ext4. Кроме того в именах файлов пользователи часто используют нежелательные знаки (. , : ; ! ? * @ # " ^ и др.). При миграции не копируются множество файлов, а файлов очень много;
2)в структуре каталогов присутствуют множество разветвленных вложений, я максимально насчитал 11, но может быть и больше, также с очень длинными именами, в которых также присутствуют нежелательные символы. Соответственно каталоги также не копируются.
Собственно по проблеме 1 я накидал bash-скрипт, который отрабатывает по каталогу и его вложениям, где располагается скрипт:
#!/bin/bash
# Удаляем символы: , ; " ? ! * # @ из имен файлов
find "$(dirname "$0")" -type f | while read -r file; do
new_filename=$(basename "$file" | tr -d ',;\"?!*#@$%^<>|~+')
# Преобразуем имя файла в нужную кодировку utf-8 и удаляем недопустимые символы
new_filename=$(echo "$new_filename" | iconv -f utf-8 -t utf-8//TRANSLIT)
new_file="${file%/*}/$new_filename"
if [ "$file" != "$new_file" ]; then
mv "$file" "$new_file"
echo "Удалены символы из имени файла: $new_filename"
fi
done
# Сокращаем имена файлов более 100 символов и добавляем цифру к имени, если оно уже существует
find "$(dirname "$0")" -type f | while read -r file; do
filename=$(basename "$file")
if [ ${#filename} -gt 100 ]; then
new_filename=$(echo "$filename" | cut -c 1-100)
extension="${filename##*.}"
new_filename=$(echo "$new_filename" | iconv -f utf-8 -t utf-8//TRANSLIT)
new_file="${file%/*}/$new_filename.$extension"
counter=1
while [ -e "$new_file" ]; do
new_file="${file%/*}/$new_filename-$counter.$extension"
((counter++))
done
mv "$file" "$new_file"
echo "Сокращенное имя файла: $new_filename.$extension"
fi
done
Скрипт сначала удаляет нежелательные символы из имен файлов, а затем сокращает имена файлов до 100 символов и если такое имя файла уже существует, то добавляет к имени цифру. Скрипт работает, но выдает ошибку о недопустимом символе 99, и не удаляет символ #. Помогите пожалуйста скорректировать код что бы не выходила ошибка и удалялись все символы. По второй проблеме я накидал скрипт, который также удаляет нежелательные символы из имен каталогов:
#!/bin/bash
# Получаем текущий каталог, где находится скрипт
current_dir="$(dirname "$0")"
# Перечисляем все подкаталоги текущего каталога
for dir in "$current_dir"/*/; do
# Убираем только указанные нежелательные символы из названия подкаталога
new_name=$(basename "$dir" | tr -d '.!?",~*^;:`')
# Если новое имя отличается от старого, переименовываем каталог
if [[ "$new_name" != $(basename "$dir") ]]; then
echo "Переименовываю $dir в $new_name"
mv "$dir" "$current_dir/$new_name"
else
echo "Имя $dir не требует изменений."
fi
done
И вот тут возникли проблемы, удаление символов происходит только в первом каталоге, но не происходит в последующих его вложениях и я не знаю как это победить, так как после удаления символов из имени каталога, видимо, изменяется путь. В идеале подскажите как написать код, который будет удалять нежелательные символы из всех вложенных подкаталогов и сокращать имена каталогов до 100 символов.