Приведенный ниже код инициализирует «последнюю» переменную, затем перебирает массив (, начиная со второго элемента ), и проверяет, меньше ли этот элемент, чем предыдущий; если это так, код отображает сообщение об ошибке и останавливает цикл.
lastone=${array[0]:1}
for((i=1; i < ${#array[@]}; i++))
do
if (( "${array[i]:1}" < "$lastone" ))
then
echo failure
break
fi
lastone=${array[i]:1}
done
В качестве альтернативы, попросите bash напечатать каждый элемент в отдельной строке, удаляя первый/начальный символ, затем передать это в sort
и спросить, отсортирован ли ввод:
if printf '%d\n' "${array[@]/#?/}" | sort -cn 2>/dev/null
then
echo is sorted
else
echo is not sorted
fi
Мы используем утилиту GNU find
, которая просматривает дерево каталогов и по пути собирает информацию. -опция depth заставит find выполнить глубину -первый обход дерева и мы придумываем имена каталогов, в которых хранится ровно один обычный файл. Затем мы перемещаем этот файл вверх и удаляем только что очищенный каталог.
find. -depth ! -name. -type d -execdir \
sh -c '
isFileKnt_1() {
test "$(cd "$1" && find. -maxdepth 1 -type f | grep -c /)" -eq 1
}
for d do
t=$(mktemp -d)
isFileKnt_1 "$d" || exit 0
mv "$d"/* "$t"/.
rmdir "$d"
mv "$t"/*.
done
' find-sh {} +
дерево -F-выводы до и после операции.
.
├── dirB/
│ └── dirB
├── dirC/
│ ├── file_2
│ └── file_3
└── dirD/
└── dirD
.
├── dirB
├── dirC/
│ ├── file_2
│ └── file_3
└── dirD