folder1 中有1000多张图片,文件名为" Firstname_Lastname_0032somenumber.jpg" 。我必须用 folder2 中的200多个更新图像替换其中一些图像,文件名为" firstname lastname.jpg"
所以我尝试使用bash脚本来完成此操作,但我无法完成
将文件名存储到2个数组(arr1,arr2)
shopt -s nullglob
arr1=(folder1/*)
arr2=(folder2/*)
获取arr1中每个元素的文件名(firstname / lastname)的子字符串
for i in "${arr1[@]}"
do
echo "$i" | cut -d'/' -f 2 | cut -d'_' -f 1 | tr '[:upper:]' '[:lower:]'
done
检查子字符串是否与arr2
答案 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。