Get the exact size of files retrieved by find outputHow to get folder size ignoring hard links?Using parameters in a scriptUsing find and sed to copy 20th line of many files into one fileHow to copy modified files while preserving folder structureHow to find files and act on them (find + exec)Script or command to list all top-level directories that contain sub-directories with modified files less than 30 days oldHow does Linux calculate the total block count when running /bin/ls -l?Escaping double quotes for variables in bash and qmake
Can a passenger predict that an airline or a tour operator is about to go bankrupt?
Lighthouse Alternatives
麦酒 (ばくしゅ) for "beer"
Would an object shot from earth fall into the sun?
I just compiled bitcoind and run for the first time. Do I already have a private key?
How do we know neutrons have no charge?
Did the Soviet army intentionally send troops (e.g. penal battalions) running over minefields?
Is there an in-universe explanation of how Frodo's arrival in Valinor was recorded in the Red Book?
Get the exact size of files retrieved by find output
As a team leader is it appropriate to bring in fundraiser candy?
Why does `FindFit` fail so badly in this simple case?
Realistically, how much do you need to start investing?
What action is recommended if your accommodation refuses to let you leave without paying additional fees?
Meaning of "fin" in "fin dai tempi"
The answer is a girl's name (my future granddaughter) - can anyone help?
How is this situation not a checkmate?
How to level a picture frame hung on a single nail?
How to find places to store/land a private airplane?
How to say "respectively" in German when listing (enumerating) things
A word that refers to saying something in an attempt to anger or embarrass someone into doing something that they don’t want to do?
What's the global, general word that stands for "center tone of a song"?
Does Bank Manager's discretion still exist in Mortgage Lending
Why aren't faces sharp in my f/1.8 portraits even though I'm carefully using center-point autofocus?
Approximate the perfect fifth
Get the exact size of files retrieved by find output
How to get folder size ignoring hard links?Using parameters in a scriptUsing find and sed to copy 20th line of many files into one fileHow to copy modified files while preserving folder structureHow to find files and act on them (find + exec)Script or command to list all top-level directories that contain sub-directories with modified files less than 30 days oldHow does Linux calculate the total block count when running /bin/ls -l?Escaping double quotes for variables in bash and qmake
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;
My shell engine is either Busybox 1.31.0 or bash 3.2
I need to get the size of the files retrieved from find command.
I've been trying to find only files, which have been modified more than 60 days ago and at the same time get the size of all those files SUMARIZED preferably in a one-liner in MB notation. Here's what I've tried.
find -type f -mtime +60 -print0 | xargs -0 du -smc
and
find -type f -mtime +60 -exec du -smc ;
The former retrieves line-by-line all files older than 60 days (no problem at all until here) but it weirdly calculates the size several times between all those lines and at the final line I get a "total" size that does not correspond to the actual total size of the output. Here's what it looks like.
.....
.....
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275 total
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12 total
The latter's output calculate the size of every coinciding file line-by-line with no total.
What I'm expecting is:
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
54 total
Or simply just the real size result without all the lines
54 total
Any help would be well received.
bash command-line find disk-usage busybox
New contributor
add a comment
|
My shell engine is either Busybox 1.31.0 or bash 3.2
I need to get the size of the files retrieved from find command.
I've been trying to find only files, which have been modified more than 60 days ago and at the same time get the size of all those files SUMARIZED preferably in a one-liner in MB notation. Here's what I've tried.
find -type f -mtime +60 -print0 | xargs -0 du -smc
and
find -type f -mtime +60 -exec du -smc ;
The former retrieves line-by-line all files older than 60 days (no problem at all until here) but it weirdly calculates the size several times between all those lines and at the final line I get a "total" size that does not correspond to the actual total size of the output. Here's what it looks like.
.....
.....
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275 total
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12 total
The latter's output calculate the size of every coinciding file line-by-line with no total.
What I'm expecting is:
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
54 total
Or simply just the real size result without all the lines
54 total
Any help would be well received.
bash command-line find disk-usage busybox
New contributor
Do you want the size of the output offind
, or the size of the files returned byfind
? Your commands are doing the second, but your question asks for the first. Also, whatfind
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?
– terdon♦
8 hours ago
With GNU find you can use-printf %b
and get rid ofdu
entirely:find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should usedu -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.
– mosvy
7 hours ago
add a comment
|
My shell engine is either Busybox 1.31.0 or bash 3.2
I need to get the size of the files retrieved from find command.
I've been trying to find only files, which have been modified more than 60 days ago and at the same time get the size of all those files SUMARIZED preferably in a one-liner in MB notation. Here's what I've tried.
find -type f -mtime +60 -print0 | xargs -0 du -smc
and
find -type f -mtime +60 -exec du -smc ;
The former retrieves line-by-line all files older than 60 days (no problem at all until here) but it weirdly calculates the size several times between all those lines and at the final line I get a "total" size that does not correspond to the actual total size of the output. Here's what it looks like.
.....
.....
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275 total
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12 total
The latter's output calculate the size of every coinciding file line-by-line with no total.
What I'm expecting is:
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
54 total
Or simply just the real size result without all the lines
54 total
Any help would be well received.
bash command-line find disk-usage busybox
New contributor
My shell engine is either Busybox 1.31.0 or bash 3.2
I need to get the size of the files retrieved from find command.
I've been trying to find only files, which have been modified more than 60 days ago and at the same time get the size of all those files SUMARIZED preferably in a one-liner in MB notation. Here's what I've tried.
find -type f -mtime +60 -print0 | xargs -0 du -smc
and
find -type f -mtime +60 -exec du -smc ;
The former retrieves line-by-line all files older than 60 days (no problem at all until here) but it weirdly calculates the size several times between all those lines and at the final line I get a "total" size that does not correspond to the actual total size of the output. Here's what it looks like.
.....
.....
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
3275 total
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
12 total
The latter's output calculate the size of every coinciding file line-by-line with no total.
What I'm expecting is:
0 ./FOLDER 2018/Copy #183 of ~$DATABASE OTHERS - NOV.18N.xlsx
42 ./FOLDER 2018/F9C8A618.tmp
0 ./FOLDER 2018/Copy #166 of ~$DATABASE PORTFOLIO NOV.18.xlsx
10 ./FOLDER 2018/CFDC6981.tmp
2 ./FOLDER 2018/D5AAF4EB.tmp
0 ./LIFE INSURANCE/Copy #15 of ~$Copy of LIFE INSURANCE CLIENTS.xlsx
54 total
Or simply just the real size result without all the lines
54 total
Any help would be well received.
bash command-line find disk-usage busybox
bash command-line find disk-usage busybox
New contributor
New contributor
edited 7 hours ago
Jeff Schaller♦
50.1k11 gold badges74 silver badges166 bronze badges
50.1k11 gold badges74 silver badges166 bronze badges
New contributor
asked 8 hours ago
aldehc99aldehc99
184 bronze badges
184 bronze badges
New contributor
New contributor
Do you want the size of the output offind
, or the size of the files returned byfind
? Your commands are doing the second, but your question asks for the first. Also, whatfind
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?
– terdon♦
8 hours ago
With GNU find you can use-printf %b
and get rid ofdu
entirely:find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should usedu -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.
– mosvy
7 hours ago
add a comment
|
Do you want the size of the output offind
, or the size of the files returned byfind
? Your commands are doing the second, but your question asks for the first. Also, whatfind
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?
– terdon♦
8 hours ago
With GNU find you can use-printf %b
and get rid ofdu
entirely:find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should usedu -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.
– mosvy
7 hours ago
Do you want the size of the output of
find
, or the size of the files returned by find
? Your commands are doing the second, but your question asks for the first. Also, what find
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?– terdon♦
8 hours ago
Do you want the size of the output of
find
, or the size of the files returned by find
? Your commands are doing the second, but your question asks for the first. Also, what find
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?– terdon♦
8 hours ago
With GNU find you can use
-printf %b
and get rid of du
entirely: find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should use du -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.– mosvy
7 hours ago
With GNU find you can use
-printf %b
and get rid of du
entirely: find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should use du -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.– mosvy
7 hours ago
add a comment
|
2 Answers
2
active
oldest
votes
Try pipe the output of find
to du
and specify the --files0-from -
flag:
find -type f -mtime +60 -print0 | du -shc --files0-from -
This should give you a grand total at the end
To get just the total, pipe that output to tail -n1
:
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
I should mention that I actually just tested this with gnu linux, not busybox. Looking at the busybox page, it does not look like du
supports the --files0-from
option.
You can change the above command to this to have it work on busybox:
du -ch $(find -type f -mtime +60) | tail -n1
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
add a comment
|
In principle this is easy: just tell find
to run du
on a bunch of files at once.find . -type f -mtime +60 -exec du -smc +
Unfortunately this doesn't work reliably, because -exec … +
can execute the command multiple times, it only tries to group the arguments, and it cannot possibly group all the arguments if their total length would go over the system's command line length limit. And in fact BusyBox find (at least the version I tested just now) doesn't try grouping at all: -exec … +
processes one argument at a time, line -exec … ;
. There's no way to be sure to get a single total
line.
GNU du
can be told to read an arbitrarily long list of file names with --files0-from
, but other versions of du
, in particular the one in BusyBox, can only take file names from the command line.
So if you can't assume that you have GNU du
, there's no way to avoid running du
multiple times, and this means you need another tool to do the summing, which in turn requires that du
doesn't round the sizes. The summing is simple with awk if the output of du
is parseable.
If you can assume that there are no newlines in file names, or you're ok with excluding paths that contain newlines, the output of du
is easy to parse: just one file per line.
newline='
'
find . ! -path "*$newline*" -type f -mtime +60 -exec du -k + |
awk 'kB += $1 END printf "%d MBn", (kB + 512) / 1024'
add a comment
|
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
aldehc99 is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f543676%2fget-the-exact-size-of-files-retrieved-by-find-output%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try pipe the output of find
to du
and specify the --files0-from -
flag:
find -type f -mtime +60 -print0 | du -shc --files0-from -
This should give you a grand total at the end
To get just the total, pipe that output to tail -n1
:
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
I should mention that I actually just tested this with gnu linux, not busybox. Looking at the busybox page, it does not look like du
supports the --files0-from
option.
You can change the above command to this to have it work on busybox:
du -ch $(find -type f -mtime +60) | tail -n1
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
add a comment
|
Try pipe the output of find
to du
and specify the --files0-from -
flag:
find -type f -mtime +60 -print0 | du -shc --files0-from -
This should give you a grand total at the end
To get just the total, pipe that output to tail -n1
:
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
I should mention that I actually just tested this with gnu linux, not busybox. Looking at the busybox page, it does not look like du
supports the --files0-from
option.
You can change the above command to this to have it work on busybox:
du -ch $(find -type f -mtime +60) | tail -n1
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
add a comment
|
Try pipe the output of find
to du
and specify the --files0-from -
flag:
find -type f -mtime +60 -print0 | du -shc --files0-from -
This should give you a grand total at the end
To get just the total, pipe that output to tail -n1
:
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
I should mention that I actually just tested this with gnu linux, not busybox. Looking at the busybox page, it does not look like du
supports the --files0-from
option.
You can change the above command to this to have it work on busybox:
du -ch $(find -type f -mtime +60) | tail -n1
Try pipe the output of find
to du
and specify the --files0-from -
flag:
find -type f -mtime +60 -print0 | du -shc --files0-from -
This should give you a grand total at the end
To get just the total, pipe that output to tail -n1
:
find -type f -mtime +60 -print0 | du -shc --files0-from - | tail -n1
I should mention that I actually just tested this with gnu linux, not busybox. Looking at the busybox page, it does not look like du
supports the --files0-from
option.
You can change the above command to this to have it work on busybox:
du -ch $(find -type f -mtime +60) | tail -n1
edited 5 hours ago
answered 8 hours ago
smac89smac89
2821 gold badge2 silver badges10 bronze badges
2821 gold badge2 silver badges10 bronze badges
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
add a comment
|
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
1
1
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
Great contribution @smac89 Your first two commands worked just fine. They piped correctly the output and executed what I needed. You're right, in the Busybox page there is not support for --files0-from in du but they got the job done. Contrary to this, the latter command didn't work, it printed some du:invalid option exceptions.
– aldehc99
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
@aldehc99 glad to hear it. What was the error you get with the last command?
– smac89
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
I have tested it with several files and realized it cannot handle filenames containing spaces. It seems to split said filenames, making the other part of them look like other commands: du: cannot access `./TESTINGFILE': No such file or directory When the filename does not contain spaces it works as expected.
– aldehc99
4 hours ago
add a comment
|
In principle this is easy: just tell find
to run du
on a bunch of files at once.find . -type f -mtime +60 -exec du -smc +
Unfortunately this doesn't work reliably, because -exec … +
can execute the command multiple times, it only tries to group the arguments, and it cannot possibly group all the arguments if their total length would go over the system's command line length limit. And in fact BusyBox find (at least the version I tested just now) doesn't try grouping at all: -exec … +
processes one argument at a time, line -exec … ;
. There's no way to be sure to get a single total
line.
GNU du
can be told to read an arbitrarily long list of file names with --files0-from
, but other versions of du
, in particular the one in BusyBox, can only take file names from the command line.
So if you can't assume that you have GNU du
, there's no way to avoid running du
multiple times, and this means you need another tool to do the summing, which in turn requires that du
doesn't round the sizes. The summing is simple with awk if the output of du
is parseable.
If you can assume that there are no newlines in file names, or you're ok with excluding paths that contain newlines, the output of du
is easy to parse: just one file per line.
newline='
'
find . ! -path "*$newline*" -type f -mtime +60 -exec du -k + |
awk 'kB += $1 END printf "%d MBn", (kB + 512) / 1024'
add a comment
|
In principle this is easy: just tell find
to run du
on a bunch of files at once.find . -type f -mtime +60 -exec du -smc +
Unfortunately this doesn't work reliably, because -exec … +
can execute the command multiple times, it only tries to group the arguments, and it cannot possibly group all the arguments if their total length would go over the system's command line length limit. And in fact BusyBox find (at least the version I tested just now) doesn't try grouping at all: -exec … +
processes one argument at a time, line -exec … ;
. There's no way to be sure to get a single total
line.
GNU du
can be told to read an arbitrarily long list of file names with --files0-from
, but other versions of du
, in particular the one in BusyBox, can only take file names from the command line.
So if you can't assume that you have GNU du
, there's no way to avoid running du
multiple times, and this means you need another tool to do the summing, which in turn requires that du
doesn't round the sizes. The summing is simple with awk if the output of du
is parseable.
If you can assume that there are no newlines in file names, or you're ok with excluding paths that contain newlines, the output of du
is easy to parse: just one file per line.
newline='
'
find . ! -path "*$newline*" -type f -mtime +60 -exec du -k + |
awk 'kB += $1 END printf "%d MBn", (kB + 512) / 1024'
add a comment
|
In principle this is easy: just tell find
to run du
on a bunch of files at once.find . -type f -mtime +60 -exec du -smc +
Unfortunately this doesn't work reliably, because -exec … +
can execute the command multiple times, it only tries to group the arguments, and it cannot possibly group all the arguments if their total length would go over the system's command line length limit. And in fact BusyBox find (at least the version I tested just now) doesn't try grouping at all: -exec … +
processes one argument at a time, line -exec … ;
. There's no way to be sure to get a single total
line.
GNU du
can be told to read an arbitrarily long list of file names with --files0-from
, but other versions of du
, in particular the one in BusyBox, can only take file names from the command line.
So if you can't assume that you have GNU du
, there's no way to avoid running du
multiple times, and this means you need another tool to do the summing, which in turn requires that du
doesn't round the sizes. The summing is simple with awk if the output of du
is parseable.
If you can assume that there are no newlines in file names, or you're ok with excluding paths that contain newlines, the output of du
is easy to parse: just one file per line.
newline='
'
find . ! -path "*$newline*" -type f -mtime +60 -exec du -k + |
awk 'kB += $1 END printf "%d MBn", (kB + 512) / 1024'
In principle this is easy: just tell find
to run du
on a bunch of files at once.find . -type f -mtime +60 -exec du -smc +
Unfortunately this doesn't work reliably, because -exec … +
can execute the command multiple times, it only tries to group the arguments, and it cannot possibly group all the arguments if their total length would go over the system's command line length limit. And in fact BusyBox find (at least the version I tested just now) doesn't try grouping at all: -exec … +
processes one argument at a time, line -exec … ;
. There's no way to be sure to get a single total
line.
GNU du
can be told to read an arbitrarily long list of file names with --files0-from
, but other versions of du
, in particular the one in BusyBox, can only take file names from the command line.
So if you can't assume that you have GNU du
, there's no way to avoid running du
multiple times, and this means you need another tool to do the summing, which in turn requires that du
doesn't round the sizes. The summing is simple with awk if the output of du
is parseable.
If you can assume that there are no newlines in file names, or you're ok with excluding paths that contain newlines, the output of du
is easy to parse: just one file per line.
newline='
'
find . ! -path "*$newline*" -type f -mtime +60 -exec du -k + |
awk 'kB += $1 END printf "%d MBn", (kB + 512) / 1024'
answered 8 hours ago
GillesGilles
577k140 gold badges1190 silver badges1702 bronze badges
577k140 gold badges1190 silver badges1702 bronze badges
add a comment
|
add a comment
|
aldehc99 is a new contributor. Be nice, and check out our Code of Conduct.
aldehc99 is a new contributor. Be nice, and check out our Code of Conduct.
aldehc99 is a new contributor. Be nice, and check out our Code of Conduct.
aldehc99 is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f543676%2fget-the-exact-size-of-files-retrieved-by-find-output%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Do you want the size of the output of
find
, or the size of the files returned byfind
? Your commands are doing the second, but your question asks for the first. Also, whatfind
is this? Do you have GNU tools? You mention busybox, so I guess this isn't a full GNU/Linux system?– terdon♦
8 hours ago
With GNU find you can use
-printf %b
and get rid ofdu
entirely:find . -mtime +60 -type f -printf '%bn' | awk 's+=$1ENDprint s/2048"M"'
. With busybox find and du, you should usedu -smc $(find ...)
and hope for the best ;-) Whether your shell is bash or busybox matters very little.– mosvy
7 hours ago