LINUX.ORG.RU

нужна помощь в написании скрипта для поиска самых больших файлов

 , , ,


0

1

скрипт должен найти 10 самых больших файлов. скрипт принимает один аргумент - директорию для поиска, если аргумента нет или аргумент -h или — help, то выводит справку, если более одного аругменты - то выводит сообшение об ошибке и справку, скрипт должен понимать имя директории с пробелами и др спецсимволами, и обрабатывать ситуацию, когда директория не существует. пока вот что смог написать

echo "Введите имя директории и нажмите Enter"
read $name_dir
find /$name_dir/ -type d -exec du -sh {} 2>/dev/null + | sort -rh | head -n 10



Последнее исправление: vladredbull1 (всего исправлений: 6)

filename = $1

Пробелов тут нельзя.

[-f $filename]

А здесь надо.

echo ’regular file detected

Кавычку закрывающую забыл.

Thetan ★★★
()
Ответ на: комментарий от Thetan

лол))) я просто только начинаю, много ошибок допускаю( А с первом как быть ? знаешь ?

vladredbull1
() автор топика

find /$1/*

Глоб не нужен.

filename = $1

Пробелы не должны стоять.

[-f $filename]

Пробелы должны быть.

else

В конце конструкции fi забыл.


я просто только начинаю

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


И вместо создания нового треда, если что-то не дописал, его можно редактировать.

mord0d ★★★★★
()
Ответ на: комментарий от vladredbull1

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

mord0d ★★★★★
()
Ответ на: комментарий от vladredbull1

Другое дело.

Тебе просто вывести список, или что-то с этими файлами делать?

Если просто вывести список, то так:

ls -1S /dir/ | head -n10

Если нужно с ними что-то делать, то можно скормить список xargs (но придётся пригораживать полный путь):

ls -1S $HOME | head -n10 | sed "s,^,$HOME/," | xargs file -i

В утилитах GNU аргументы могут быть другими, сверяйся с документацией.

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от vladredbull1

так теперь лучше ?

Интересно вы bash изучаете, методом тыка... Ни к чему это хорошему не приведет. Ибо в таком языке, как bash каждый символ может сделать тоже что-то без явной ошибки и надо понимать почему и зачем тут ставится конкретный символ и как он интерпретируется. Так $name_dir/* звездочу раскроет bash, а не find, а -name '*' - сам find, name = $var - тоже валидная команда, но это именно как вызов команды name c минимум двумя аргументами, и почему минимум надо тоже понимать, и почему в [ ] $filename писать без кавычек — плохо. Резумируя — вот это всё никак методом тыка познать невозможно.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Ни к чему это хорошему не приведет.

Внесите fork bomb!

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Мне с ними ни чего делать не надо, просто надо вывести этот список, ты вводишь директорию, в скрипт находит 10 самых больших файлов в этой директории, и если я что-то не то ввел(нет такой директории допустим), то вывести что нет такого, ну или если ввести -help, то вывести сообщение мол это справка. И скрипт должен понимать имя директории с пробелами и др спецсимволами

vladredbull1
() автор топика
Ответ на: комментарий от vladredbull1

Слишком комплексная задача для обучающего материала.

ты вводишь директорию

man read

скрипт находит 10 самых больших файлов

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

и если я что-то не то ввел(нет такой директории допустим), то вывести что нет такого

[ ! -d "${variable}" ]

ну или если ввести -help

man builtin, case:

case "${1}" in
  (-h*) print_help() ;;
  (*) : ;;
esac

И скрипт должен понимать имя директории с пробелами и др спецсимволами

Ищи в интернете разницу между $variable, "$variable" и ${variable}, примеров тысячи.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Я вот так решил сделать, но если ввожу какую-нибудь директорию, он мне не выводит ее топ 10 файлов по объему

#!/bin/bash
echo 'Введите директорию'
echo 'Для вывода справки введите --help'

read a

a=$(du -S $1 | sort -rn | head -n -10)
h=$(bash --help)
if [[ -d $1 ]]
then
echo ${a};
else
echo ${h};
fi

vladredbull1
() автор топика
Ответ на: комментарий от vladredbull1

Ты вначале читаешь переменную ${a} из STDIN:

read a

Затем сразу её переназначаешь:

a=$(du -S $1 | sort -rn | head -n -10)

Затем пытаешься проверить, не директория ли первый аргумент, скормленный скрипту аргументом (при запуске yourscript /some/dir это будет работать, но read об этом знать не будет).

Тебе нужно понимать, кто такие ${@}, ${0}..${9}, ${?} и ещё с десяток переменных. И методом тыка ты ничего не добьёшься.

#!/bin/sh

echo -n 'enter a directory path: '
while :; do
	read dir
	if [ -d "${dir}" ]; then
		ls -1S "${dir}" | head -n10 | sed "s,^,${dir}/," | xargs du -hs
		exit 0
	else
		echo -n 'it is not a directory, try again: ' >&2
	fi
done

Оставлю понимание сей магии в качестве домашнего задания. ☺

mord0d ★★★★★
()

Что ты делаешь? Может тебе ncdu нужна?

anonymous
()
Ответ на: комментарий от mord0d

Но что произойдёт, если при развёртывании переменной в имени файла вдруг окажется replstr ({})?

Ничего такого. Во входных данных на предмет replace_str поиск не осуществляется. Взяли бы и попробовали: xargs "-I{}" echo "/{}"

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.