Как выполнять поиск в подкаталогах, содержащих только 1 файл, и перемещать файл на один шаг вверх в родительский каталог

Приведенный ниже код инициализирует «последнюю» переменную, затем перебирает массив (, начиная со второго элемента ), и проверяет, меньше ли этот элемент, чем предыдущий; если это так, код отображает сообщение об ошибке и останавливает цикл.

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
0
09.02.2021, 08:58
1 ответ

Мы используем утилиту 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
0
18.03.2021, 22:31

Теги

Похожие вопросы