Other day, I was trying to copy the proc folder with following command:
tar cvzf /tmp/proc.tgz /proc
and I found out that all the files in tar were empty. Strange it may seem but lot of people are facing this as /proc is not a regular filesystem, so I wrote a quick script to copy the proc folder. Here is the script:
[[ -z $1 ]] && exit -1
find /proc/$1/ -not -name pagemap | while read F ; do
if [[ -d $F ]]
echo "$(ls -ld $F) => Directory"
mkdir -p $D
if [[ -L $F ]]
echo "$(ls -ld $F) => copied"
cp -P $F /tmp/$F
elif [[ -f $F ]]
echo "$(ls -ld $F) => Cat"
cat $F > /tmp/$F
echo "Dont know $F"
I generallly keep doing this a lot, so thought will share with you. Lets assume we are capturing free ouput every min/hour/or whatever. The output looks like this:
Time: Mon Jan 21 23:59:10 AEDT 2019
total used free shared buff/cache available
Mem: 32014 8656 1735 1697 21621 21308
Swap: 51195 75 51120
then we can use some grep and sed to convert this to something like this:
Mon Jan 21 23:59:10 AEDT 2019,32014,8656,1735,1697,21621,21308
This is the code that I used for this:
zgrep -E '^(Time|Mem):' free.20190121.gz |sed -E '/Mem/ s/\s+/,/g'|sed -E 's/^(Time|Mem):\s*//' |sed ':a;$!N;s/\n//;P'
use zgrep to get the line starting with time or mem
use sed to convert multiple spaces to single space
use sed again to get only the line containing Memory or time
use sed the last time to merge the 2 lines
Lot of times, I want to find the directories with maximum number of files and so I wrote this quick function to do exactly the same
function count_lines ()
find . -type d |while read line
echo -n "$(find $line -type f |wc -l) $line"
printf "Directories :: %8d\r" $count >&2
} # ---------- end of function count_lines ----------