Переместить только определенный подкаталог в новую папку с помощью скрипта оболочки

Переместить только определенный подкаталог в новую папку с помощью скрипта оболочки

У меня есть папка, Accountsсодержащая почтовые аккаунты, все эти папки имеют папку Archive.folder. Я хочу переместить все архивные папки с помощью простого скрипта в новую папку.

Я попробовал это на данный момент:

find . -mindepth 1 -maxdepth 1 ! -name archive -exec mv -t testnew/ {} + 

Но он перемещает все папки, а не только те, которые называются archive. Я хочу найти все папки в текущей папке archive и переместить их в папку testnew/. Путь к перемещенной папке должен быть таким же, как и раньше.

Текущая ситуация:

Accounts
    - 1
          - archive
          - inbox
          - folder2
    - 2
          - archive
          - inbox
          - folder2

    - 3
          - archive
          - inbox
          - folder2

Как это должно выглядеть:

testnew
    - 1
          - archive
    - 2
          - archive
    - 3
          - archive

решение1

Если это нормально, то это vidirможет быть хорошим способом. Смотретьэтот ответ.

В вашем случае процедура будет такой:

  1. cd /path/to/Accounts
    find . -type d -name archive | vidir -
    
  2. vidirзапустит текстовый редактор. Используйте "поиск и замена" и замените все начальные символы ./на любой путь, который вы хотите, чтобы строки соответствовали желаемой структуре каталогов. Пути могут быть абсолютными или относительными, они могут содержать ../. Например, вы можете легко превратить это

    ./1/archive
    ./2/archive
    ./3/archive
    

    в это

    ../testnew/1/archive
    ../testnew/2/archive
    ../testnew/3/archive
    
  3. Сохраните отредактированный файл и выйдите из редактора.

Примечания:

  • Если ваша структура каталогов содержит каталоги с именами, заканчивающимися на .(так что ./подстрока появляется не только в начале), то лучше заменить <TAB>./на <TAB>whatever/path/you/want/, где <TAB>указывает на символ табуляции. Это зависит от редактора, можете ли вы включить этот символ в «поиск и замена».
  • Выберите редактор, указав EDITOR, например find … | EDITOR=kate vidir -, .
  • vidirне может перемещать файлы между файловыми системами. Если все archiveкаталоги принадлежат одной файловой системе, а вы хотите testnewоказаться в другой файловой системе, то создайте testnewв исходной файловой системе, используйте vidirи, наконец, переместите testnewв целевую файловую систему.
  • В концеэто еще один ответесть экспериментальный подход, который (аб)использует, EDITORчтобы сделать vidirнеинтерактивным. ОднакоЯ нахожу vidirполезным в таких случаях, как ваш, в основном потому, что это позволяет мне убедиться, что полученные пути действительно такие, какие я хочу, прежде чем произойдет какое-либо переименование/перемещение. Если я что-то испорчу, я могу прерваться, не сохраняя изменения.Если вам нужно неинтерактивное решение вашей проблемы, то vidirэто не лучший инструмент.

Связанный контент