当子串匹配时交换文件名

时间:2015-03-24 15:53:02

标签: bash shell

folder1 中有1000多张图片,文件名为" Firstname_Lastname_0032somenumber.jpg" 。我必须用 folder2 中的200多个更新图像替换其中一些图像,文件名为" firstname lastname.jpg"

所以我尝试使用bash脚本来完成此操作,但我无法完成

  1. 将文件名存储到2个数组(arr1,arr2)

     shopt -s nullglob 
     arr1=(folder1/*)
     arr2=(folder2/*)
    
  2. 获取arr1中每个元素的文件名(firstname / lastname)的子字符串

    for i in "${arr1[@]}"
     do
       echo "$i" | cut -d'/' -f 2 | cut -d'_' -f 1 |  tr '[:upper:]' '[:lower:]'
    done
    
  3. 检查子字符串是否与arr2

  4. 中的子字符串匹配
  5. 重命名文件

2 个答案:

答案 0 :(得分:2)

更好的解决方案是关联数组。第一步就像步骤#2中的代码一样,创建一个数组,其中folder1的文件名是键:

declare -A map
for i in "${arr1[@]}"; do
   key=$(basename "$i" | cut -d'_' -f 1-2 |  tr '[:upper:]' '[:lower:]' | tr '_' ' ')
   map[$key]="$i"
done

这会将Firstname_Lastname_0032somenumber.jpg转换为firstname lastname(全部小写,_替换为空格。)

现在循环文件夹2中的文件,以类似的方式处理它们以获取获取新文件名的密钥:

for i in "${arr2[@]}"; do
   key=$(basename "$i" .jpg | tr '[:upper:]' '[:lower:]')
   newName=${aa[$key]}
   if [[ -n "$newName" ]]; then
       echo "mv \"$folder2/$i\" \"$folder1/$newName\""
   fi
done

相关:

答案 1 :(得分:0)

我的方法可能更像是一次一个地从folder1读取循环中的文件,从文件中删除路径的前导部分(可以使用basename和dirname命令拆分路径组件),然后将文件名拆分为标记,重新组合标记并通过将固定的文件名附加到该字符串将其复制到folder2。

for path in $(ls "folder1/"*); do {
  file=$(/usr/bin/basename path)
  firstAndLast=${file%_*}
  first=${firstAndLast%%_*}
  last=${firstAndLast##*_}
  outputPath=folder2/${first}${last}.jpg
}

您也可以翻译字符串字母大小写,当然,类似于您所做的。您应该能够在* NIX系统中的/ usr / bin或/ bin中找到basename和dirname。