You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

483 lines
14 KiB

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<title>
NCDU: NCurses Disk Usage // Hagfi.sh
</title>
<link href="http://gmpg.org/xfn/11" rel="profile">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="author" content="Kristof Vandam">
<meta name="generator" content="Hugo 0.92.0" />
<meta property="og:title" content="NCDU: NCurses Disk Usage" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="en_US" />
<meta property="og:url" content="https://blog.hagfi.sh/tools/ncdu/" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/0.5.0/base-min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/0.5.0/pure-min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/pure/0.5.0/grids-responsive-min.css">
<link rel="stylesheet" href="https://blog.hagfi.sh//css/redlounge.css">
<link rel="stylesheet" href="https://blog.hagfi.sh//css/prism.css">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
<link href='//fonts.googleapis.com/css?family=Raleway:400,200,100,700,300,500,600,800' rel='stylesheet' type='text/css'>
<link href='//fonts.googleapis.com/css?family=Libre+Baskerville:400,700,400italic' rel='stylesheet' type='text/css'>
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/touch-icon-144-precomposed.png">
<link rel="shortcut icon" type="image/x-icon" href="/img/favicon.png">
<link href="" rel="alternate" type="application/rss+xml" title="Hagfi.sh" />
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.1/fuse.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/vuewordcloud@18.7.11/VueWordCloud.js"></script>
<script src="https://blog.hagfi.sh//js/prism.js"></script>
<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-124890410-1', 'auto');
ga('send', 'pageview');
}
</script>
</head>
<body>
<div id="layout" class="pure-g">
<div class="sidebar pure-u-1 pure-u-md-1-4" id="app">
<div class="header">
<h1 class="brand-title"><a href="/">Hagfi.sh</a></h1>
<h2 class="brand-tagline">A devops guide to the galaxy</h2>
<div class="counters">
<a class="counter" href="/">13
<div class="counter-sub">Documents</div>
</a>
<a class="counter" href="/tags">29
<div class="counter-sub">Tags</div>
</a>
<a class="counter" href="/categories">3
<div class="counter-sub">Categories</div>
</a>
</div>
<nav class="nav">
</nav>
<div class="search-wrapper">
<input
type="text"
placeholder="Search ..."
v-model="search"
@keydown.down.prevent="navigate(1)"
@keydown.up.prevent="navigate(-1)"
@keyup.enter.prevent="navigate(result[selected].href)"
ref="searchInput"
class="search"
/>
<svg height="100" width="100" ref="resultPoint" class="result-point">
<circle cx="5" cy="5" r="5" fill="#FFF" />
</svg>
<ul class="result-items">
<li v-for="r, i of result" class="result-item" ref="resultItem">
<div class="result-item-wrapper" :class="{ 'result-item-selected': selected === i }">
<div class="result-item-left">
<span class="post-date">
<span class="post-date-day"><sup v-text="moment(r.date).format('D')"></sup></span><span class="post-date-separator" v-text="'/'"></span><span class="post-date-month" v-text="moment(r.date).format('MMM')"></span> <span class="post-date-year" v-text="moment(r.date).format('YYYY')"></span>
</span>
<template v-if="r.author">By <a class="post-author" v-text="r.author"></a></template>
</div>
<div class="result-item-left">
<span class="result-item-separator nav-item-separator" v-text="'//'"></span><a :href="r.href" v-text="r.title" class="result-item-link"></a>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="content pure-u-1 pure-u-md-3-4">
<a name="top"></a>
<div id="toc" class="pure-u-1 pure-u-md-1-4">
<small class="toc-label">Contents</small>
<nav id="TableOfContents">
<ul>
<li><a href="#comparison-with-du">Comparison with &lsquo;du&rsquo;</a></li>
<li><a href="#options">Options</a></li>
<li><a href="#advanced-ncdu">Advanced ncdu</a>
<ul>
<li><a href="#json-for-development">JSON for development</a></li>
<li><a href="#store-result">Store result</a></li>
<li><a href="#use-stored-result">Use stored result</a></li>
</ul>
</li>
<li><a href="#author">Author</a></li>
</ul>
</nav>
</div>
<section class="post">
<h1 class="post-title">
<a href="/tools/ncdu/">NCDU: NCurses Disk Usage</a>
</h1>
<h3 class="post-subtitle">
</h3>
<span class="post-date">
<span class="post-date-day"><sup>17</sup></span><span class="post-date-separator">/</span><span class="post-date-month">Sep</span> <span class="post-date-year">2018</span>
</span>
<span class="post-author-single">By <a class="post-author" target="">Kristof Vandam</a></span>
<div class="post-categories">
<a class="post-category post-category-tools" href="https://blog.hagfi.sh//categories/tools">tools</a>
<a class="post-category post-category-administration" href="https://blog.hagfi.sh//categories/administration">administration</a>
</div>
<p>ncdu is a command line tool to scan and calculate directory and file sizes.</p>
<h2 id="comparison-with-du">Comparison with &lsquo;du&rsquo;</h2>
<p>While the initial scan is about the same as du, ncdu keeps the results in memory. This
can become handy when investigating the storage hog. You can compare the already cached
results immediately with a <em>(r)</em> escan.</p>
<p>Also navigation is a breese. <em>ncdu</em> creates a interactive session where the arrow keys are
used to open and close directories.</p>
<h2 id="options">Options</h2>
<p>ncdu is not bloated with options, but each of these are useful and easy to remember. All these are
used inside the interactive session.</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>up, k</td>
<td>Move cursor up</td>
</tr>
<tr>
<td>down, j</td>
<td>Move cursor down</td>
</tr>
<tr>
<td>right/enter</td>
<td>Open selected directory</td>
</tr>
<tr>
<td>left, &lt;, h</td>
<td>Open parent directory</td>
</tr>
<tr>
<td>n</td>
<td>Sort by name</td>
</tr>
<tr>
<td>s</td>
<td>Sort by size</td>
</tr>
<tr>
<td>C</td>
<td>Sort by items</td>
</tr>
<tr>
<td>d</td>
<td>Delete selected file or directory</td>
</tr>
<tr>
<td>t</td>
<td>Toggle dirs before files when sorting</td>
</tr>
<tr>
<td>g</td>
<td>Show percentage and/or graph</td>
</tr>
<tr>
<td>a</td>
<td>Toggle between apparent size and disk usage</td>
</tr>
<tr>
<td>c</td>
<td>Toggle display of child item counts</td>
</tr>
<tr>
<td>e</td>
<td>Show/hide hidden or excluded files</td>
</tr>
<tr>
<td>i</td>
<td>Show information about selected item</td>
</tr>
<tr>
<td>r</td>
<td>Recalculate the current directory</td>
</tr>
<tr>
<td>b</td>
<td>Spawn shell in current directory</td>
</tr>
<tr>
<td>q</td>
<td>Quit ncdu</td>
</tr>
</tbody>
</table>
<h2 id="advanced-ncdu">Advanced ncdu</h2>
<h3 id="json-for-development">JSON for development</h3>
<pre tabindex="0"><code class="language-.language-command" data-lang=".language-command">ncdu -x / -o- | jq
</code></pre><blockquote>
</blockquote>
<ul>
<li><strong>-x</strong> chose directory &lsquo;/&rsquo;</li>
<li><strong>-o-</strong> output to stdout</li>
</ul>
<p>Will create a JSON object of the current directory and all his subdirectories. This can come
handy for developing or generating reports.</p>
<h3 id="store-result">Store result</h3>
<pre tabindex="0"><code class="language-.language-command" data-lang=".language-command">ncdu -0xo- / | gzip &gt; scan.gz
</code></pre><blockquote>
</blockquote>
<ul>
<li><strong>-0</strong> surpress unwanted output</li>
<li><strong>-x</strong> chose directory &lsquo;/&rsquo;</li>
<li><strong>-o-</strong> output to stdout</li>
</ul>
<h3 id="use-stored-result">Use stored result</h3>
<pre tabindex="0"><code class="language-.language-command" data-lang=".language-command">zcat scan.gz | ncdu -f-
</code></pre><blockquote>
</blockquote>
<ul>
<li><strong>-f</strong> read from stdin</li>
</ul>
<h2 id="author">Author</h2>
<p><a href="https://dev.yorhel.nl/ncdu/man">Official Website</a></p>
<div class="tags-list">
<span class="dark-red">Tags</span><span class="decorative-marker">//</span>
<a class="post-tag post-tag-du" href="https://blog.hagfi.sh//tags/du">du</a>,
<a class="post-tag post-tag-ncdu" href="https://blog.hagfi.sh//tags/ncdu">ncdu</a>,
<a class="post-tag post-tag-directory" href="https://blog.hagfi.sh//tags/directory">directory</a>,
<a class="post-tag post-tag-size" href="https://blog.hagfi.sh//tags/size">size</a>,
<a class="post-tag post-tag-inventory" href="https://blog.hagfi.sh//tags/inventory">inventory</a>,
</div>
<div class="paging">
<span class="paging-label">More Reading</span>
<div class="paging-newer">
<span class="dark-red">Newer</span><span class="decorative-marker">//</span>
<a class="paging-link" href="/development/live-search-with-hugo/">Live Search With HUGO</a>
</div>
<div class="paging-older">
<span class="dark-red">Older</span><span class="decorative-marker">//</span>
<a class="paging-link" href="/administration/toubles-with-interfaces-after-clone/">Troubles with interfaces after a VM clone</a>
</div>
</div>
</section>
<div id="disqus_thread"></div>
<script type="application/javascript">
var disqus_config = function () {
};
(function() {
if (["localhost", "127.0.0.1"].indexOf(window.location.hostname) != -1) {
document.getElementById('disqus_thread').innerHTML = 'Disqus comments not available by default when the website is previewed locally.';
return;
}
var d = document, s = d.createElement('script'); s.async = true;
s.src = '//' + "hagfish" + '.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="https://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
<div class="footer">
<hr class="thin" />
<div class="pure-menu pure-menu-horizontal pure-menu-open">
<ul class="footer-menu">
</ul>
</div>
<p>&copy; 2022. All rights reserved.</p>
</div>
</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
fuse: null,
search: "",
result: [],
index: [],
selected: 0
},
mounted() {
let self = this
window.addEventListener("keypress", function(e) {
self.$refs.searchInput.focus()
})
let options = {
shouldSort: true,
threshold: 0.6,
location: 0,
distance: 100,
maxPatternLength: 32,
minMatchCharLength: 1,
keys: [
"title",
"author",
"date",
"content"
]
}
axios.get('/index.json')
.then(function (response) {
self.index = response.data
self.fuse = new Fuse(response.data, options)
})
.catch(function (error) {
})
},
watch: {
result(nval, oval) {
nval.length > 0 ? this.pointer(0) : this.pointer(-1)
},
search(nval, oval) {
this.result = this.fuse.search(nval)
}
},
methods: {
navigate(val) {
switch (val) {
case 1: if (this.selected < this.result.length - 1) { this.selected++ }; break;
case -1: if (this.selected > 0 ) { this.selected-- }; break;
default: window.location.href = val; break;
}
this.pointer(this.selected)
},
pointer(selected) {
let self = this
if (selected >= 0) {
Vue.nextTick().then(function() {
let height = self.$refs.resultItem[selected].clientHeight
let top = self.$refs.resultItem[selected].getBoundingClientRect().top
let left = self.$refs.resultItem[selected].getBoundingClientRect().left
self.$refs.resultPoint.style.top = (top+height/2)+'px'
self.$refs.resultPoint.style.left = (left-20)+'px'
})
} else {
this.$refs.resultPoint.style.left = '-50px'
return
}
}
}
})
</script>
</body>
</html>