Удалить файл, если разницы нет

Для удалите шлюз в команде Linux:route delete default gw 192.168.1.1 eth1

Для добавьте шлюз в команду Linux:route add default gw 192.168.1.250 eth1

1
13.01.2020, 18:18
2 ответа

Вы можете сделать что-то вроде этого:

for file in /path/to/dirA/*; do
    fileName=${file##*/}
    diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
    rm /path/to/dirB/"$fileName"
done

Это будет перебирать все файлы в dirA, сохраняя каждый как $file. Обратите внимание, что $fileбудет включать путь, поэтому это будет /path/to/dirA/file1, а не просто file1. Вот почему нам нужно получить имя файла, что мы и делаем, удаляя все до последней косой черты (fileName=${file##*/}). Затем мы молча сравниваем файл с одноименным файлом в каталоге B и, если они идентичны, то в случае успешного завершения diffмы удаляем файл из каталога B. &&означает «запустить следующий команда, только если эта будет успешной», поэтому rmбудет запускаться только в том случае, если файлы идентичны.

Чтобы сделать его рекурсивным, предполагая, что вы используете bash, используйте:

shopt -s globstar
cd /path/to/dirA/
for file in **; do
    fileName=${file#*/}
    echo diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
    rm /path/to/dirB/"$fileName"
done

Или, что более сложно, пропустить каталоги и -несуществующие файлы:

shopt -s globstar
cd /path/to/dirA/
for file in **; do
    if [ -d "$file" ]; then 
        echo "$file is a directory, skipping."; 
    else
        fileName=${file#*/}
        if [[ -e /path/to/dirB/"$fileName" ]]; then
            echo diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
            rm /path/to/dirB/"$fileName"
        fi
    fi
done
1
27.01.2020, 23:40

Используйте инструмент, такой как fdupes, который специально разработан для этого путем вычисления хэша md5 для каждого файла. Я не буду вдаваться здесь в подробности, потому что есть некоторые оговорки, например, потеря данных, если вы укажете один и тот же каталог дважды. Например, если вы укажете /home/ и~/ одновременно, файлы в вашем домашнем каталоге будут указаны как их собственные дубликаты. Если вы настроите fdupes на автоматическое удаление дубликатов, вы в конечном итоге удалите все файлы в своем домашнем каталоге!

Вероятно, самое полезное, что вы можете сделать, это набрать man fdupesв CLI, что покажет вам руководство со всеми опциями, так что вы сможете найти для себя лучший способ его использования и какие опции вы хотели бы использовать или нет. Предостережения — это не то, чего нужно бояться, а то, о чем нужно знать, и это, вероятно, лучший способ научиться пользоваться такими инструментами, потому что вы лучше поймете, что они делают. Вы не получите этого преимущества, если будете «вслепую» копировать -и вставлять предложения, данные в ответах.

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

В качестве альтернативы вы можете рассмотреть fslint, который, по-видимому, является полезным инструментом на основе -графического интерфейса пользователя. Сам никогда не пробовал, поэтому ничего не могу сказать о нем.

0
27.01.2020, 23:40

Теги

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