
Мне нужно переместить два конкретных файла, назовем их 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
искать только те файлы, которые соответствуют globfile[AB].txt
.В качестве альтернативы, чтобы сопоставить либо
fileA.txt
либоfileB.bb
, мы используем два-name
теста, объединенных логическим ИЛИ (-o
) и сгруппированных вместе скобками:\( -name 'fileA.txt' -o -name 'fileB.bb' \)
-execdir mv {} ../ \;
указываетfind
chdir на каталог файла и запускает команду оболочки,mv {} ../
гдеfind
заменит{}
на фактическое имя файла. Выражение../
на языке Unix означает родительский каталог. Завершающий символ\;
просто отмечаетfind
конец команды оболочки