Мне заполнили каталог тысячами файлов в формате LastnameFirstnameYYYYMMDD.pdf. Фамилия и имя всегда будут в случае заголовка.
Я хотел бы извлечь фамилию, таким образом, я могу переместить эти файлы в структуру каталогов {первая буква фамилии}/lastname/full имя файла. Пример: DoeJohn20190327 был бы перемещен в D/Doe/DoeJohn20190327
Здесь у Вас есть решение. Я протестировал его, это создает папки, как Вы объяснили.
for filename in *.pdf
do
echo "Processing file $filename "
first_letter="${filename:0:1}"
mkdir -p $first_letter #if already exists won't print error
last_name=$(echo $filename | sed 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' |awk '{print $1}')
mkdir -p $first_letter/$last_name
mv $filename $first_letter/$last_name
done
Если lastname всегда является самой короткой запаздывающей строкой, смотрящей с прописной буквой (нет никакого составного объекта lastnames, например), Вы могли использовать расширение параметра оболочки формы ${parameter%pattern}
вместо regex решения.
Напр.
for f in [[:upper:]]*[[:upper:]]*; do
d="${f:0:1}/${f%[[:upper:]]*}/"
echo mkdir -p "$d"
echo mv "$f" "$d"
done
mkdir -p D/Doe/
mv DoeJohn20190327 D/Doe/
Удалите echo
s, когда Вы удовлетворены, что это делает правильную вещь.
Посмотрите, например, Расширение Параметра