Как удалить структуру каталогов с помощью командной строки (или скрипта)

У меня есть большая коллекция файлов, упакованных в двухуровневую структуру каталогов со многими, многими и многими папками.

Другими словами, у меня есть папка с большим количеством подпапок в ней. В этих подпапках нет подпапок, однако в них есть сотни файлов.

То, что я хотел бы сделать, – это переместить все файлы из этих подпапок в каталог, содержащий подпапки.

Это ограниченная система ресурсов, поэтому способ сделать это без двух копий всех этих файлов, которые должны существовать сразу, будет потрясающим ……

  • rm -fr не работает
  • Проверьте, существует ли в каталоге несколько файлов
  • Удалить * .txt файлы по дате между MMDDYYYY и MMDDYYYYY
  • Сравните существующий файл в двух разных каталогах, скопируйте, если не существует, иначе перезапишите его
  • Владелец общей папки
  • Найти команду, связанную с файлом конфигурации
  • Каталоги с двумя или более файлами
  • Скопируйте только определенные типы файлов из структуры папок в другую
  • 2 Solutions collect form web for “Как удалить структуру каталогов с помощью командной строки (или скрипта)”

    С инструментами GNU:

    cd that-dir && find . -mindepth 2 ! -type d -exec mv -it . {} + 

    Перейдите в родительский каталог и запустите

     mv -- */* . 

    ( -- необходимо, только если есть подкаталоги, имя которых начинается с - )

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

     mv -- */* */.[!.]* */..?* . mv -- .[!.]*/* .[!.]*/.[!.]* .[!.]*/..?* . mv -- ..?*/* ..?*/.[!.]* ..?*/..?* . 

    Убедитесь, что конфликтов нет, иначе последний файл, который вы перемещаете, будет автоматически перезаписывать ранее перенесенный файл с тем же именем. Передайте параметр -i в mv (т. mv -i */* . ) Для запроса в случае конфликта.

    Затем вы можете удалить подкаталоги:

     rmdir */ 

    Если вы получите сообщение о том, что в командной строке слишком много времени, вам придется сделать это несколькими шагами. Легкий способ заключается в команде find :

     find */ -type f -exec mv -i {} . \; 

    или, немного быстрее:

     find */ -type f -exec sh -c 'mv -i -- "$@" "$0"' . {} + 

    Еще быстрее, в не встроенной системе Linux:

     find . -mindepth 2 -type f -exec mv -it . {} + 
    Interesting Posts

    Как создать гостевой KVM с графикой SPICE, но TLS отключен с помощью virt-install?

    Выделите сегодня в Mac

    Как загрузить ISO и непосредственно создать загрузочный USB

    Как разделить файл размером 6 или 7 ГБ на несколько файлов под-2 ГБ без разделения записи?

    Установка PCRE 32bit на RHEL 5 – разрешение зависимости для установки apache 2.4

    В правилах udev назначается одинаковое имя порта для модема с 4 портами ttyUSB

    Передайте массив BASH для сравнения с содержимым файла

    Безопасный туннельный порт через промежуточного хоста

    Понимание возможностей сборки ядра (переводчики?)

    Простейшая возможная защищенная песочница (необходимы ограниченные ресурсы)

    Разрешение отклонено для доступа пользователя к монтированию

    Программа Bash не выполняется, если перенаправление не сработает

    Заменить указанный символ между двумя строками?

    Башрик для виртуального терминала

    Какова цель UUID для сетевых адаптеров?

    Linux и Unix - лучшая ОС в мире.