Хорошо, я собираюсь ответить на свой собственный вопрос.
Я сделал свой собственный 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
Который работает на мои цели.
Это не 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 {} +
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
du -P
-P, --нет -разыменование не переходить по символическим ссылкам (это значение по умолчанию)