Предполагая, что имена файлов и каталогов следуют одному и тому же соглашению об именах в том смысле, что они имеют общий префикс группировки, за которым следует точка, и предполагая, что мы не знаем суффиксов имен файлов или каталогов:
topdir=.
for dirname in "$topdir"/*/; do
prefix=$( basename "$dirname" ) # $topdir/FileC.directory/ --> FileC.directory
prefix=${prefix%%.*} # FileC.directory --> FileC
for filename in "$topdir/$prefix".*; do
if [ ! -d "$filename" ]; then
mv -i "$filename" "$dirname"
fi
done
done
Внешний цикл перебирает все каталоги в каталоге $topdir
(, здесь установленном на .
, текущем каталоге ). $prefix
будет базовым именем имени каталога с удаленным битом после первой точки.
После того, как префикс был вычислен, файлы )не из -каталогов (в том же каталоге $topdir
, которые имеют один и тот же префикс, перемещаются в каталог.
Хорошо, я понял, что здесь происходит. Команда terraform state show
по умолчанию будет включать escape-символы для цвета, жирности и т. д. К сожалению, эти символы вообще не отображаются в терминале, потому что, как ни странно, они, кажется, отключают любой видимый эффект всякий раз, когда он фактически переходит к напечатать что угодно! Итак, в моем случае $xxx выглядело так:
[1m[0mwebsite_endpoint[0m[0m="magnus-misc-v2.s3-website-us-east-1.amazonaws.com"
... и поскольку [0m
удаляет все форматирование и цвета, я не получил визуального намека на то, что этот джаз мешает моемуeval
-инг. Так что исправлением в моем случае было использование флага terraform state show -no-color
. На самом деле это не проблема bash, а некоторые запутанные вещи в интерфейсе командной строки terraform.
Всякий раз, когда у вас есть строка, представляющая строковое присвоение переменной, безопасный и простой способ выполнить это назначение —declare
(и Использование More Quotes™):
$ xxx='website_endpoint="my-site.s3-website-us-east-1.amazonaws.com"'
$ declare "$xxx"
$ echo "$website_endpoint"
"my-site.s3-website-us-east-1.amazonaws.com"