Чтобы отсортировать все обычные файлы в текущем каталоге или в нем по размеру, оболочка zsh
предоставляет удобный **
шаблон подстановки, который соответствует /
в путях (, т.е. «рекурсивно вниз в подкаталоги )Это также позволяет квалифицировать шаблон так, чтобы вы, например, получали совпадения только с обычными файлами, а результаты сортировались в соответствии с размером этих файлов.
В оболочке zsh
этот шаблон будет выглядеть как
**/*(.OL)
Это вернет все обычные файлы (.
), упорядоченные в обратном(O
)порядке размера(L
).
Чтобы получить список только файлов, используйте
printf '%s\n' **/*(.OL)
Чтобы получить ls
«длинный список», используйте
ls -fl **/*(.OL)
(опция -f
запрещает ls
выполнять собственную сортировку файлов ).
Если zsh
не является вашей обычной оболочкой, вы все равно можете использовать эти команды, предполагая, что zsh
установлен в вашей системе:
zsh -c 'ls -fl **/*(.OL)'
Очевидно, вы могли бы также добавить --block-size=M
к этому, если вы используете GNU ls
.
Если вас интересуют только десять самых больших файлов, используйте шаблон
**/*(.OL[1,10])
вместо этого.
Мой подход состоит в том, чтобы создать каталог с хэш-ссылкой на каждый файл.
если хэш уже существует, я заменяю файл жесткой -ссылкой из хэша, если файл хэша не существует, я создаю новую жесткую ссылку из файла в каталоге хэша.
примерно так:
#!/bin/bash
dupes=/mnt/xfs/.dupes_dir
for x in "$@"
do
sha=$( sha1sum "$x" | cut -d\ -f1 )
if [ -e $dupes/$sha ]
then
ln -f $dupes/$sha "$x"
else
ln "$x" $dupes/$sha
fi
done