在 Bash 中从文件名中提取名称

在 Bash 中从文件名中提取名称

我有一个目录,里面有数千个文件,格式为 LastnameFirstnameYYYYMMDD.pdf。姓和名始终采用标题大小写。

我想提取姓氏,这样我就可以将这些文件移动到 {姓氏首字母}/姓氏/完整文件名的目录结构中。例如:DoeJohn20190327 将移动到 D/Doe/DoeJohn20190327

答案1

这里有解决方案。我测试了一下,它按照你解释的那样创建了文件夹。

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

答案2

如果姓氏始终是以大写字母开头的最短尾随字符串(例如,没有复合姓氏),则可以使用形式的 shell 参数扩展来${parameter%pattern}代替正则表达式解决方案。

前任。

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。

例如参数扩展

相关内容