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

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

Мне нужно переместить два конкретных файла, назовем их fileA.txt и fileB.sh, в родительскую папку.

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

Иерархия папок выглядит следующим образом:Иерархия папок

Родительская папка уникальна и должна оставаться неизменной. Всего более 2000 папок находятся в подпапках 200-300 родительских папок, содержащих дочерние папки.

У меня пока что не работает следующее в BASH:

find -maxdepth 4 -type f -name ‘*.bb’ ‘*.txt’; mv ../.

Я ОЧЕНЬ новичок в написании сценариев и знаю, что это очень простая задача. Прошу прощения за ужасный рисунок, но я слишком долго бился головой об стену.

решение1

Чтобы переместить любой файл с именем fileA.txtили fileB.txtв его непосредственный родительский каталог:

find . -maxdepth 4 -type f -name 'file[AB].txt' -execdir mv {} ../ \;

Или, чтобы переместить любой файл с именем fileA.txtили fileB.bbв его непосредственный родительский каталог:

find . -maxdepth 4 -type f \( -name 'fileA.txt' -o -name 'fileB.bb' \) -execdir mv {} ../ \;

Как это работает

  • .указывает findначать с текущего каталога. (Вы можете заменить его на любой другой каталог, который вам нравится.

  • -maxdepth 4говорит findне опускаться более чем на четыре уровня в глубь структуры каталогов.

  • -type f говорит findискать только обычные файлы.

  • -name 'file[AB].txt'указывает findискать только те файлы, которые соответствуют glob file[AB].txt.

    В качестве альтернативы, чтобы сопоставить либо fileA.txtлибо fileB.bb, мы используем два -nameтеста, объединенных логическим ИЛИ ( -o) и сгруппированных вместе скобками:

    \( -name 'fileA.txt' -o -name 'fileB.bb' \)
    
  • -execdir mv {} ../ \;указывает findchdir на каталог файла и запускает команду оболочки, mv {} ../где findзаменит {}на фактическое имя файла. Выражение ../на языке Unix означает родительский каталог. Завершающий символ \;просто отмечает findконец команды оболочки

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