В разделе у меня есть несколько файлов и папок, и я могу перечислить все эти размеры файлов с помощью du
следующим образом:
du -h
Но как я могу перечислить все файлы, которые выходят за рамки определенного размер дискового пространства, например, 5 МБ?
Вот простое решение в bash, которое анализирует размер файлов и папок:
#!/bin/bash
folder="$1"
limit="$2"
IFS= первый параметр - это целевая папка для изучения
второй параметр - это ограничение в килобайтах, где 1K = 1024 байта.
\n'
for item in `find "$folder"`; do
size=$(du -s "$item" | cut -f1)
if [ $size -gt $limit ]; then
echo $item
fi
done
первый параметр - это целевая папка для изучения
второй параметр - это ограничение в килобайтах, где 1K = 1024 байта.
Будьте осторожны: du
не печатает размер файла, он дает вам оценку использования файлового пространства.
Вы можете создать файл размером 10 МБ, который использует гораздо меньше:
dd if=/dev/zero of=file seek=10M count=1 bs=1
stat -c %s file
ls -lh file
du -h file
cat file | wc
Примером является сжатый файл, который использует меньше места на диске, чем его размер, как в примере выше разреженный файл .
В приведенном выше примере find . -type f -size +5M
выдаст file
, даже если du
намного меньше, чем 5M.
Если вы знаете, что в именах файлов нет новых строк, вы можете отфильтровать вывод find
с помощью:
find . -type f -size +5M | while IFS= read -r file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done
Если в именах ваших файлов могут быть строки, вы можете использовать это расширение GNU. , но затем используйте что-то еще, кроме echo
в цикле:
find . -type f -size +5M -print0 | while IFS= read -r -d '' file; do
du=$(du -k "$file")
size="${du%%$(printf "\t")*}"
if test $size -gt $((5 * 1024)); then
echo "$file"
fi
done
find /home/stephenm/ -maxdepth 1 -size +20k -exec du -h {} \;
В списке / home / stephenm
должно быть указано что-либо свыше 20 тыс., Чтобы перейти в подкаталоги, опустите опцию -maxdepth 1
.