Поиск и замена с помощью пользовательской утилиты

Замените escape-последовательность \ w в обычном PS1 на \ W . Таким образом, в вашем примере это будет примерно так:

PS1='\u@\h \W\$ '
0
18.07.2018, 20:00
2 ответа

Если я правильно понял ваш вопрос, вы хотите увидеть список владельцев крупнейших каталогов (в порядке убывания ). Другими словами:

  1. Вы хотите отсортировать каталоги по размеру
  2. Найдите идентификатор пользователя каждого из 20 крупнейших каталогов.

Если вы хотите увидеть вывод в формате ls -l, попробуйте это:

(du -sh./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }' | sort --key=5,5hr

Пример вывода:

drwxrwxrwx 1 root root  1017G   Jun 20 15:44 Raw_data_files
drwxrwxrwx 1 root root  188G    May 12 11:34 Old_data
drwxrwxrwx 1 root root  8.8G    Jul 12 15:28 backups
drwxrwxrwx 1 root root  1.4G    Jun 29 15:32 randomized_sets
-rwxrwxrwx 1 root root  124M    May 22 10:41 archive_web.html.7z
-rwxrwxrwx 1 root root  113M    Jan 15 14:51 example1.tif
-rwxrwxrwx 1 root root  113M    Apr 15 13:27 example3.pdf
-rwxrwxrwx 1 root root  1.0M    Apr 15 09:17 sample_info.xlsx
-rwxrwxrwx 1 root root  1.0M    Apr 27 09:20 sample_info2.xlsx
-rwxrwxrwx 1 root root  1.0M    Jun 12 09:18 sample_run.R

Как видите, это дает вам отсортированный список (на основе размера )всех каталогов и файлов. Но вас интересуют только каталоги/папки, их размер и идентификатор пользователя. Поэтому, если вы добавите простой канал ко всему этому (команде выше )и используете команду grep(, т.е. добавите | grep "^d" --color=never"к команде выше ), вы получите только перечисленные каталоги, и файлы больше не будут перечислены.

drwxrwxrwx 1 root root  1017G   Jun 20 15:44 Raw_data_files
drwxrwxrwx 1 root root  188G    May 12 11:34 Old_data
drwxrwxrwx 1 root root  8.8G    Jul 12 15:28 backups
drwxrwxrwx 1 root root  1.4G    Jun 29 15:32 randomized_sets

Таким образом, в этом случае полная команда будет выглядеть следующим образом:

(du -sh./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }' | sort --key=5,5hr | grep "^d" --color=never"

Все, что вам нужно сделать дальше, это добавить head -20к команде выше, чтобы увидеть только 20 самых больших каталогов.

Все кредиты принадлежат пользователю Stack OverflowSebi. См. эту ветку на SO для получения дополнительной информации:Использование ls для вывода списка каталогов и их общего размера

0
28.01.2020, 04:17

Чтобы сохранить результат команды в переменной, вам просто нужно обернуть команду между ``или $():

yourvar=`date +%Y`

или

yourvar=$(date +%Y)

yourvar будет иметь значение текущего года (2018 ). Вы также можете выполнить результат прямо в своей команде:

ls -la|  grep `date +%Y`

или

ls -la|  grep $(date +%Y)

Чтобы добиться желаемого, я бы использовал цикл for:

for i in `du -h |sort -rh|awk '{print $2}'|sed "s/.\///g"`;do ls -la |grep $i|awk '{print $3 " " $9}';done

Имейте в виду, что команда является грубым примером, и ее, возможно, придется подправить, чтобы избежать дублирования (, поскольку, если в вашем каталоге есть подкаталоги, у вас будут разные выходные данные для одного и того же родителя ).

0
28.01.2020, 04:17

Теги

Похожие вопросы