Bash Script - Как я могу получить размер каталогов в файле.txt и сохранить их в другой файл?
Я начал несколько недель с программирования на bash для Linux, но у меня возникла проблема: как я могу получить размер нескольких каталогов (путь, сохраненный в файле.txt), а затем записать в другой файл, путь к каталогу, затем по размеру и общему размеру, занимаемому этими каталогами. Я уже пробовал это, но я не уверен:
totsize=0
while read -r diretory; do
size=$(du -ch "$directory")
echo "$diretory size: $size" > "$homedir/$filename2"
$totsize += $(du -c "$homedir/$diretorio")
done < "$homedir/diretories.txt"
sudo echo "total size: $totsize" >> "$homedir/$filename2"
Заранее спасибо (и извините за плохой английский)
3 ответа
Использование find в сочетании с du и перенаправить в файл с >
sudo find /path/to/topDir -maxdepth 1 -type d -exec du -sh {} \; > output.txt
Пример:
xieerqi:$ sudo find Desktop -maxdepth 1 -type d -exec du -sh {} \; > outputFile1.txt
[sudo] password for xieerqi:
xieerqi:$ cat outputFile1.txt
2.7G Desktop
69M Desktop/linux-kernel-4.1.0
1.1M Desktop/DOCS
6.8M Desktop/The comments that became a reporter’s death sentence | New York Post_files
4.0K Desktop/newdir
6.7M Desktop/IMAGES
12M Desktop/TIRES
504K Desktop/MSU-TEMPLATES
341M Desktop/PDFS
19M Desktop/java
Чтобы эта команда указывала использование диска для определенных каталогов из списка, вы можете объединить команды cat и xargs с приведенной выше командой. Например,
cat dirList.txt | xargs -I dir sudo find dir -maxdepth 0 -type d -exec du -sh {} \;
Некоторые каталоги, владельцем которых вы не являетесь, требуют sudo доступ к списку их использования диска, следовательно, объединить это с sudo sh -c, Позвольте мне продемонстрировать,
xieerqi:$ sudo sh -c "cat dirList.txt | xargs -I dir find dir -maxdepth 0 -type d -exec du -sh {} \+"
[sudo] password for xieerqi:
2.7G /home/xieerqi/Desktop
11M /bin
5.5G /usr
xieerqi:$ cat dirList.txt
/home/xieerqi/Desktop
/bin
/usr
При работе с файлами или каталогами по их имени я настоятельно рекомендую иметь дело с ними, разделенными нулевым символом, а не переводом строки. Потому что официально имя файла может содержать символ новой строки. Поэтому вам не следует составлять список каталогов, разделенных новой строкой.
В любом случае, когда у вас есть этот список, вы можете просто использовать это:
du -sch --files0-from=dirs.txt
-sкак-d0и будет суммировать только итоги по каждому аргументу.-cрассчитывает общий итог.-hделает все это в удобочитаемом формате.--files0-from=dirs.txtчитает имена файлов / каталогов из данного файла, оканчивающиеся нулевым байтом.
С вашим списком это будет выглядеть так (но с ошибкой имен файлов с символами новой строки):
tr '\n' '\0' <dirs.txt | du -sch --files0-from=-
Вы можете получить размер каталогов с du команда как это:
du -h -d 1 "path to parent directory"
-d: глубина подкаталогов