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

247
J.Mike

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

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

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

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

То, что я до сих пор, что в BASH это не работает, это:

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

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

2

1 ответ на вопрос

3
John1024

Чтобы переместить любой файл с именем 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искать только те файлы, которые соответствуют глобу file[AB].txt.

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

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

Какой невероятно хорошо объясненный ответ! Я нашел альтернативный обходной путь, который не работает так широко, но я собираюсь настроить несколько тестовых папок и попробовать это снова, чтобы я мог учиться на этом. Спасибо вам большое! J.Mike 6 лет назад 0
Кроме того, если бы я хотел удалить дочернюю папку после удаления из нее файлов, я бы просто добавил; -rm в конце или это удалит новый родительский каталог? J.Mike 6 лет назад 0
@ J.Mike Хотя написанное спасибо приятно и, вероятно, высоко ценится ответчиком, отличный способ продемонстрировать благодарность за помощь человека - это выбрать его ответ в качестве принятого (если, конечно, вы считаете, что он этого заслуживает). Вот полезное руководство по [что делать, когда кто-то отвечает на ваш вопрос] (https://superuser.com/help/someone-answers). CJK 6 лет назад 1

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