du пропускают символьные ссылки

Хорошо, я собираюсь ответить на свой собственный вопрос.

Я сделал свой собственный awk сценарий на основе решения @pradeepchhetri.

cat data.txt | sort | awk '
BEGIN{FS=OFS="/";}{
    path=$0;
    for(i=NF;i>0;i--){
        NF--;
        if($0 in paths){next;}
    }
    paths[path]=path;
}
END{for(path in paths){print path;}}' | sort

Который работает на мои цели.

8
29.11.2018, 20:18
3 ответа

Это не du , разрешая символические ссылки; Это твоя раковина.

* - это раковина; Он расширяется оболочкой перед запуском любой команды. Таким образом, пример, команда, которую вы работаете:

du -s /data/ghs/14 /data/ghsb/14 /data/hope/14 /data/rssf/14 /data/roper/14

Если ваша оболочка Bash, у вас нет способа сказать ему не расширять SymLinks. Однако вы можете использовать Найти (версия GNU) вместо этого:

find /data -mindepth 2 -maxdepth 2 -type d -name 14 -exec du -s {} +
15
27.01.2020, 20:09

Заставить duпропускать символические ссылки:

duнедостаточно умен, чтобы не гнаться за ссылками. По умолчанию findбудет пропускать символические ссылки. Таким образом, создавая нечестивый союз между find, duи awk, правильное заклинание темной магии становится:

find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print total}'

Производит:

145070492

Чтобы вывод был удобочитаемым для человека:

find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print (total / 1024 / 1024) "MB"}'

Производит:

138.35MB

Что здесь происходит:

/home/somedirectory/      directory to search.
-exec du -s +             run du -s over the results, producing bytes
awk '...'                 get the first token of every line and add them up,
                          dividing by 1024 twice to produce MB
7
27.01.2020, 20:09
du -P

-P, --нет -разыменование не переходить по символическим ссылкам (это значение по умолчанию)

0
04.11.2020, 18:43

Теги

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