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

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

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

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

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

  • Наличие нескольких компьютеров в файле доступа к сети?
  • Создайте каталог, используя имена файлов, и переместите файлы в соответствующую папку
  • файл соответствует / proc / locks
  • Переименовать файлы для изменения знаков пунктуации и нумерации
  • поиск каталогов, содержащих один файл, и отсутствие другого
  • Где мои данные 7za записываются в
  • Удалить каталог под Cryptkeeper без доступа к его учетной записи
  • Как преодолеть «занятое устройство или ресурс»?
  • 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 . {} + 
    Linux и Unix - лучшая ОС в мире.