Intereting Posts

Как получить счет всех расширений файлов на жестком диске с помощью терминала gnu + linux?

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

Как это сделать в терминале на gnu + linux?

find /filesystem -xdev -type f -name '?*.*' -print0 | awk -F. -vRS='\0' ' {c[$NF]++}; END{for (i in c) print c[i],i}' | sort -rn | less 

Где /filesytem – точка монтирования файловой системы, в которую вы хотите посмотреть.

Философия unix заключается в предоставлении строительных блоков и позволяет собирать эти строительные блоки для выполнения специализированных задач, таких как эта.

Команда find перемещает дерево каталогов и отображает файлы, соответствующие определенным критериям, или действует на них. Например, find -xdev / traverses все файлы в корневой файловой системе и отобразите их имя. Опция -xdev опускает файлы на другие файловые системы, такие как сетевые подключения, специальные файловые системы, которые предоставляют системную информацию и т. Д.

Чтобы выбрать то, что напечатано, GNU find предлагает действие -printf . Директива %f печатает имена файлов без части каталога.

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

 find / -xdev ! -name $'*\n*' -printf '%f\n' 

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

 find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' 

Достаточно find . Чтобы работать с расширениями, мы будем использовать инструменты обработки текста, используя конвейер оболочки для их объединения. Сначала sed, чтобы немного переписать, чтобы исключить часть имени файла, которая не является расширением:

 find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' | sed 's/.*\.//' 

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

 find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' | sed 's/.*\.//' | sort | uniq -c | sort -n