
Я использовал следующую команду для вывода списка десяти самых больших файлов на любой глубине в текущем каталоге:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'
(Я использую awk
вместо , head
чтобы предотвратитьошибка сломанной трубыкогда список слишком длинный)
Работает хорошо, но, очевидно, его трудно запомнить и набирать каждый раз. Я пробовал вставить это в .bash_aliases, но тогда это не работает (выводит 10 пустых строк).
Если я использую less
вместо awk
, вывод будет представлен правильно, но это означает отображение всего списка файлов размером более 10 МБ (мой нижний порог), отсортированного по размеру, а не только самых больших.
Итак, что делает awk
choke частью псевдонима команды здесь (предполагая, что проблема действительно в этом) и что я могу сделать, чтобы это исправить?
решение1
При использовании этой команды в качестве псевдонима $0
больше не защищен одинарными кавычками, поэтому преобразуется в имя вашей оболочки. Эти команды это демонстрируют:
$ alias F="echo '$0'"
$ F
bash
Имя оболочки (предположительно bash
) случайно не установленоawkимя переменной, приводящее к пустым строкам.
Одним из способов защиты $0
от расширения оболочки может быть использование чего-то вроде:
alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"
Однако, поскольку это $0
бесполезно, вы можете просто удалить это из awk
заявления.
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'
Вы можете пойти дальше и удалить весь блок, так как печать выбранной строки awk
в любом случае является поведением по умолчанию:
find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'
В качестве альтернативы вы можете просто продолжить использование head
и сбросить сообщение об ошибке:
find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head