График структуры папок:
Я совсем новичок в продвинутых командах оболочки и скриптинге. У меня есть фундаментальные знания терминала, но я никогда не пытался создать автоматизацию, подобную этой. Чистый новичок.
В этом посте я упростил свою цель, но реальный проект будет охватывать несколько тысяч папок.
По сути у меня есть папка 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
цикл не распознает последнюю строку?).