Перемещение каталогов, имена которых заканчиваются на - число, соответствующее файлу list.txt

Перемещение каталогов, имена которых заканчиваются на - число, соответствующее файлу list.txt

График структуры папок:

введите описание изображения здесь

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

В этом посте я упростил свою цель, но реальный проект будет охватывать несколько тысяч папок.

По сути у меня есть папка Source и Destination. В папке Source есть каталоги с префиксом «Car», за которым следуют «три цифры»

У меня в папке Source есть текстовый файл list.txt, представляющий собой список из «трех чисел» в каждой строке.

Я хотел бы написать команду или скрипт, который найдет каталоги и прочитает список. Если последние три цифры в имени каталога совпадают с тремя цифрами в списке. Я хотел бы переместить соответствующие папки в папку назначения.

Я прочитал множество методов, использующих find, -exec mv, xargs, «while IFS read», и я действительно не знаю, как лучше всего подойти к этому. Я только начал и надеялся, что кто-нибудь на этом форуме сможет вмешаться и не побить меня.

решение1

Скрипт для запуска в родительском каталоге Destinationи Source( .на вашем рисунке):

#!/bin/sh
while IFS= read -r l; do
   mv "Source/Car$l/" Destination/.
done < Source/list.txt

Этот скрипт читает Source/list.txtпострочно. Для каждой строки $lон пытается переместить указанный каталог Source/Car$lв Destination/..

Компонент pathname с точкой в Destination/.​​является трюком в случае, если Destinationне существует. Если Destinationне существует, то первый mv "Source/Car…/" Destination/переименовывается Source/Car…/в Destination/вместо того, чтобы помещать его внутрь Destination/. Точка имеет значение: если цель есть Destination/.и Destination/не существует, то наша mvкоманда(ы) завершится с ошибкой.

Сценарий естьтупой, он не выполняет никакой проверки на вменяемость того, что он читает из Source/list.txt. Например, если строка , 001/../../../../../../../../../../home/roco/.sshто скрипт, возможно, переместит ваш ~/.ssh/каталог в Destination/. Если есть пустая строка, то скрипт попытается переместить Source/Car/. Если последняя строка неполная, то он не доберется до mv(см.Почему этот whileцикл не распознает последнюю строку?).

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