Отличное замечание! Проблема в том, что при замене файла через mv
теряются исходные права доступа. Вот исправленный скрипт, который сохраняет владельца и права файла:
#!/bin/bash
# Проверка переданного файла
if [ $# -ne 1 ]; then
echo "Использование: $0 <файл>"
exit 1
fi
input_file="$1"
# Проверка существования файла
if [ ! -f "$input_file" ]; then
echo "Ошибка: файл '$input_file' не существует"
exit 2
fi
# Сохраняем исходные права и владельца
file_owner=$(stat -c "%U:%G" "$input_file")
file_perms=$(stat -c "%a" "$input_file")
# Создаем временный файл с сохранением прав
tmp_file=$(mktemp)
chown "$file_owner" "$tmp_file"
chmod "$file_perms" "$tmp_file"
# Удаляем дубликаты с сохранением порядка
awk '!seen[$0]++' "$input_file" > "$tmp_file"
# Проверяем размер результата
if [ -s "$tmp_file" ]; then
# Безопасная замена с сохранением метаданных
cat "$tmp_file" > "$input_file"
echo "Дубликаты удалены. Права доступа сохранены для '$input_file'"
rm -f "$tmp_file"
else
echo "Ошибка: результат пуст. Исходный файл не изменен"
rm -f "$tmp_file"
exit 3
fi
Сохранение метаданных:
file_owner=$(stat -c "%U:%G" "$input_file") # Сохраняем владельца:группу
file_perms=$(stat -c "%a" "$input_file") # Сохраняем права доступа
Применение прав к временному файлу:
chown "$file_owner" "$tmp_file"
chmod "$file_perms" "$tmp_file"
Безопасная перезапись содержимого:
cat "$tmp_file" > "$input_file"
Вместо перемещения файла мы перезаписываем содержимое исходного файла, что сохраняет:
Если вы используете macOS или BSD-системы, замените команды stat:
# Для macOS/BSD
file_owner=$(stat -f "%Su:%Sg" "$input_file")
file_perms=$(stat -f "%OLp" "$input_file")
#!/bin/bash
[ $# -ne 1 ] && echo "Использование: $0 <файл>" && exit 1
if ! command -v sponge >/dev/null; then
echo "Установка moreutils..."
sudo apt-get install -y moreutils || sudo yum install -y moreutils
fi
awk '!seen[$0]++' "$1" | sponge "$1"
echo "Дубликаты удалены с сохранением прав"
Скрипт теперь гарантирует, что после обработки: