#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
vsfor op in $@
vs ???); тот факт, что упоминается в сообщении об ошибке-r
, похоже, подразумевает (для меня), что существует проблема с тем, как вы обрабатываете свои входные параметры … но фрагмент кода, который вы предоставили, не показывает нам весь код, используемый для обработки входных параметров3. Переключился на это, и ошибка на-r исправлена, большое спасибо!
4. Сделал то же самое с опцией t, и она также исправлена.
5. nvm sudo ищет каталоги, а также обновил сообщение с исправлениями для каждого из них, спасибо за помощь в выяснении этого