Извлечь из вывода команды совместимый с unix путь к файлу с пробелом

Извлечь из вывода команды совместимый с unix путь к файлу с пробелом

команда :

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1

дает мне:

41G     /Users/user/Big folder

Как извлечь путь, чтобы повторно использовать его в своем скрипте?

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1 | awk '{ print $2 }'

Выведет

/Users/user/Big

Что бесполезно, так как я ищу такой результат:

/Users/user/Big\ folder

решение1

При выполнении автоматизированной обработки не усложняйте себе жизнь, используя числа в разных единицах. Не переходите -hк du. Тогда вы можете использовать простую числовую сортировку на выходе, и ваш скрипт все равно будет работать, если у вас в одном из каталогов больше 1 ТБ.

du -s ~/* | sort -k 1n | tail -n1

Это всегда выводит строку, даже если самый большой подкаталог содержит менее 1 ГБ. Если это не то, что вам нужно, вы можете заменить условное «является ли вывод пустым» на «является ли число меньшим, чем пороговое значение».

Чтобы извлечь имя каталога, возьмите вывод и удалите часть до первой вкладки.

largest_directory=$(du -s ~/* | sort -k 1n | tail -n1)
largest_directory_size_kB=${largest_directory%%$(printf '\t')*}  # if you need the size
largest_directory=${largest_directory#*$(printf '\t')}

решение2

ПОСИКЛИ:

du -s "$HOME"/* | sort -rnk1 | LC_ALL=C sed -e "s,[^/]*\(/.*\),'\1',;q"

Без -hрезультата duдля размера будет указано простое число, поэтому мы можем легко отсортировать его без дополнительных значений grep.

Используя sedдля выполнения удаления только первую строку, а затем выходя, мы сохраняем headвызов.

решение3

Другой способ извлечь нужный вам путь — это использовать readкоманду после того, как вы закончите делать duвсе это, sort-edа затем передать ееwhile/read

du.. sort.. | while read x d; do echo "$d"; done

Связанный контент