Извлечение имен от имени файла в Bash

Мне заполнили каталог тысячами файлов в формате LastnameFirstnameYYYYMMDD.pdf. Фамилия и имя всегда будут в случае заголовка.

Я хотел бы извлечь фамилию, таким образом, я могу переместить эти файлы в структуру каталогов {первая буква фамилии}/lastname/full имя файла. Пример: DoeJohn20190327 был бы перемещен в D/Doe/DoeJohn20190327

4
задан 30 March 2019 в 08:21

2 ответа

Здесь у Вас есть решение. Я протестировал его, это создает папки, как Вы объяснили.

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
5
ответ дан 1 December 2019 в 09:02

Если 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/

Удалите echos, когда Вы удовлетворены, что это делает правильную вещь.

Посмотрите, например, Расширение Параметра

4
ответ дан 1 December 2019 в 09:02

Другие вопросы по тегам:

Похожие вопросы: