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

#bash #shell

Вопрос:

Опция из моего сценария вызывается в эхо, где я не хочу, чтобы она вызывалась. Когда я запускаю скрипт с опцией-r, он вызывается в эхе «каталог, которого не существует». Так, например, я запускаю bash sdel.sh -r [dir] и даже если этот каталог существует и перемещен в каталог корзины, я все равно получаю сообщение об ошибке, в котором говорится, что-r не существует. Если он не существует, я получаю 2 сообщения: 1, в котором говорится, что каталог не существует, и 1, в котором говорится, что-r не существует.

Обработка параметров: ( -r исправлено)

 while getopts "hr:t:s:u:" options; do
case $options in
...
# shift $((OPTIND-1))

r) tgtdir="${OPTARG}"

  if [ ! -d "${tgtdir}" ]; then
    echo "$0: error: tried to delete directory that does not exist: ${tgtdir}"
#   shift
    continue
  fi
  tarname="${tgtdir}.tar"
  tar -cf "$tarname" "${tgtdir}"
  mv "$tarname" $trash
  rm -r "${tgtdir}"
# shift

exit;; 

esac
done
 

В другом варианте, t, я пытаюсь удалить файлы в течение x часов из пользовательского ввода, но он всегда удаляет все значения, которые я ввел. (ИСПРАВЛЕНО)

 t)
tgtdir="${OPTARG}"
now = `date  %s`
cd $trash
for f in `ls`; do
fileage=$(stat -c '%Y' "$f")

if [ $((now-fileage)) -gt $((60*60*${tgtdir})) ]; then
rm -rf "$f"
echo "Cleaning directory $trash"

else
echo "Nothing to clean in directory $trash"
fi
done
exit;;
 

Еще один из них, s, заключается в поиске и удалении файлов размером более x в КБ в каталоге $trash, но при попытке запустить его я получаю неверный аргумент.

(ИСПРАВЛЕНО)

 s)
tgtdir="${OPTARG}"
cd $trash
find . -type f -size  ${tgtdir}k -delete
exit;;
 

В u, пытаясь получить самый большой файл в каталоге и его размер, но в настоящее время он все еще возвращает мне каталог, и я хотел, чтобы это был просто файл. (ИСПРАВЛЕНО)

 u) find $trash -type f -printf '%s %pn' | sort -nr | head-1
exit;;
 

Мы ценим помощь в решении каждой из этих проблем!

Комментарии:

1. Я бы посоветовал вам сосредоточиться на одной проблеме, а затем предоставить минимальный, полностью функциональный набор кода, который воспроизводит проблему; также включите пример вызова кода, (правильный) ожидаемый вывод и (неправильный) текущий вывод

2. это не полностью функциональный сценарий; ключевое значение имеет то, как вы обрабатываете свои входные параметры (например, getopts vs for op in $@ vs ???); тот факт, что упоминается в сообщении об ошибке -r , похоже, подразумевает (для меня), что существует проблема с тем, как вы обрабатываете свои входные параметры … но фрагмент кода, который вы предоставили, не показывает нам весь код, используемый для обработки входных параметров

3. Переключился на это, и ошибка на-r исправлена, большое спасибо!

4. Сделал то же самое с опцией t, и она также исправлена.

5. nvm sudo ищет каталоги, а также обновил сообщение с исправлениями для каждого из них, спасибо за помощь в выяснении этого