Сортировка списка переменных имен файлов по размеру

Итак, причина, по которой приведенный выше код не работал, заключалась в том, что файл с именем "org.gnome.extensions.user -theme.gschema.xml" отсутствовал в "/usr/share/glib -2.0/schemas/" .

Для решения проблемы выполните следующий код:

sudo cp $HOME/.local/share/gnome-shell/extensions/user-theme@gnome-shell-extensions.gcampax.github.com/schemas/org.gnome.shell.extensions.user-theme.gschema.xml /usr/share/glib-2.0/schemas
sudo glib-compile-schemas /usr/share/glib-2.0/schemas
0
16.06.2020, 18:12
2 ответа

Если ваши имена файлов не содержат символов новой строки и в вашей системе установлена ​​GNU stat, вы можете:

  • Использовать переменную массиваfilenames
  • Используйте statдля печати размера и имени каждого файла, затем используйте sortдля результата (обратного числового )и затем удалите первое поле (размер )с cut, чтобы получить имена файлов, упорядоченные по размеру (самый большой первый ).
  • Передать результат в цикл whileдля дальнейшей обработки.

filenames=( one two three )
while IFS= read -r file; do
  echo "do something with $file"
done < <(stat --printf '%s\t%n\n' -- "${filenames[@]}" | sort -nr | cut -f2-)

То же, что и выше, но с использованием нулевого символа в качестве разделителя (, если вы не можете гарантировать, что ваши имена файлов не будут содержать новые строки; вам также понадобятся GNU sortи GNUcut):

filenames=( one two three )
while IFS= read -r -d $'\0' file; do
  printf 'do something with %s\n' "$file"
done < <(stat --printf '%s\t%n\0' -- "${filenames[@]}" | sort -znr | cut -zf2-)

Обратите внимание, что для имен файлов типа символическая ссылка учитывается размер самой ссылки (, а не файла, на который она указывает ). Добавьте опцию -Lк stat, чтобы изменить это.

Обратите внимание, что это не будет работать для файла с именем -, так как statинтерпретирует его как файл, открытый на стандартном вводе. Вместо этого используйте ./-, чтобы обойти это.

2
18.03.2021, 23:27

С zshтот же метод, что и в , который отвечает на аналогичный вопрос о сортировке по mtime , сам адаптирован из этого для сортировки массивов на основе произвольных порядков (подробности см. в последнем):

zmodload zsh/stat

array=(one two three...)

# store sizes in an "A"ssociative array:
typeset -A size
stat -nL -A size +size -- $array

# sort using the oe glob qualifier "n"umerically
sorted_array=(/(e['reply=($array)']noe['REPLY=$size[$REPLY]'])
1
18.03.2021, 23:27

Теги

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