Goodlabour.ru (main) Index TheGame

TheGame:
GameScenario - Пт 06 июн 2025
thegame_keydb_php - Пт 06 июн 2025
The game scene(godot) - Пт 06 июн 2025
autopub - Пт 06 июн 2025
Remove Duplicates - Пт 06 июн 2025 22:11:05 MSK
Status Auto Update - Сб 07 июн 2025 18:10:33 MSK
KeyDB Status Control - 07.06.2025 18:55
EngineeringApproachВт 10 июн 2025 10:09:40 MSK
Последние:
BooksNetworkSecurityВт 10 июн 2025 12:06:13 MSK
platformВс 15 июн 2025 23:50:39 MSK
PostgreqGuru-1Пт 20 июн 2025 11:08:56 MSK
ErusevParsedownReadmeПт 20 июн 2025 11:21:28 MSK
file_descriptorsПт 17 окт 2025 18:26:39 MSK

Отличное замечание! Проблема в том, что при замене файла через 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

Ключевые изменения:

  1. Сохранение метаданных:

    file_owner=$(stat -c "%U:%G" "$input_file")  # Сохраняем владельца:группу
    file_perms=$(stat -c "%a" "$input_file")     # Сохраняем права доступа
  2. Применение прав к временному файлу:

    chown "$file_owner" "$tmp_file"
    chmod "$file_perms" "$tmp_file"
  3. Безопасная перезапись содержимого:

    cat "$tmp_file" > "$input_file"

    Вместо перемещения файла мы перезаписываем содержимое исходного файла, что сохраняет:

    • Исходные права доступа
    • Владельца и группу
    • Inode файла (важно для жестких ссылок)
    • Атрибуты файловой системы

Для систем BSD/macOS:

Если вы используете macOS или BSD-системы, замените команды stat:

# Для macOS/BSD
file_owner=$(stat -f "%Su:%Sg" "$input_file")
file_perms=$(stat -f "%OLp" "$input_file")

Альтернативная версия с sponge (если установлен moreutils):

#!/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 "Дубликаты удалены с сохранением прав"

Почему это важно:

  1. Сохранение SELinux-контекста - важно для систем с Mandatory Access Control
  2. Сохранение расширенных атрибутов - xattr остаются нетронутыми
  3. Совместимость с открытыми дескрипторами - процессы, работающие с файлом, не теряют доступ
  4. Жесткие ссылки - остаются действительными

Скрипт теперь гарантирует, что после обработки: