Linux-将文件批量移动到目录中,并根据该目录中的顺序语法重命名这些文件

问题描述 投票:0回答:2

我有两个目录-A和B-包含一堆照片文件。目录A是我长期保存照片的位置,其中的文件顺序命名为“ Photo-1.jpg,Photo-2.jpg等”。

目录B是我从相机上载新照片的位置,并且命名约定是相机为文件命名的方式。我想出了如何在目录B上运行一些操作,以确保所有内容都根据需要采用.jpg格式(imagemagik转换),删除重复文件(fdupes),等等。

我现在的目标是将文件从B移到A,最后得到A中的新添加文件,这些文件根据上述A的命名约定依次命名。

我知道如何将文件移动到A中,然后在添加新文件后将其中的所有内容批量重命名(理论上每晚都会发生),但是我猜测必须有一种更有效的移动方式从B到A的文件,而不必每晚重新命名所有20,000+张照片,只是因为添加了一些新文件。

我想我的问题有两个部分-1)我找到了一个可行的解决方案(我们用mv每晚重命名所有照片),这有什么缺点吗?和2)如果存在弊端,并且存在一种更优雅的方法,那么谁能帮助一个脚本查看A中存在的最高编号的脚本,然后重命名文件,并附加到该编号上的B中。移到A了?

谢谢!

linux bash batch-rename mv
2个回答
1
投票

bash脚本只会将新文件从DiretoryB移动并重命名为您的DirectoryA路径。它还可以在DirectoryB

中处理文件名中带有空格和/或其他任何奇数字符的文件名。
#!/bin/bash

aPath="./photos-A"
bPath="./photos-B"
aPattern="Photo-"

lNum=$(find $aPath -type f -name "*.jpg" -printf "%f\n" | \
  awk -F'[-.]' '{if($2>m)m=$2}END{print m}')
while IFS= read -r -d $'\0' photo; do
        mv "$photo" "$aPath/$aPattern$((++lNum)).jpg"
done < <(find $bPath -type f -name "*.jpg" -print0)

注意

查找最后一张编号照片的命令,又名$lNum 在所有20K +文件中运行,但是应该很快。如果不是,那么您始终可以运行一次,并将最新编号存储到文件中并从该文件中读取。

概念证明

$ tree photos-A/
photos-A/
├── Photo-1.jpg
├── Photo-2.jpg
├── Photo-3.jpg
├── Photo-5.jpg
├── Photo-6.jpg
├── Photo-7.jpg
└── Photo-8.jpg

0 directories, 7 files

$ tree photos-B/
photos-B/
├── bar.jpg
├── baz\ with\ spaces.jpg
└── foo.jpg

0 directories, 3 files

$ ./mvphoto.sh

$ tree photos-A/
photos-A/
├── Photo-10.jpg
├── Photo-11.jpg
├── Photo-1.jpg
├── Photo-2.jpg
├── Photo-3.jpg
├── Photo-5.jpg
├── Photo-6.jpg
├── Photo-7.jpg
├── Photo-8.jpg
└── Photo-9.jpg

0 directories, 10 files

0
投票

如果不是递归的,for循环也可以做到。否则,globstar是另一种选择。

#!/usr/bin/env bash

shopt -s extglob nullglob

filesa=(DirectoryA/*.jpg)
filesb=(DirectoryB/*.jpg)

latest=${filesa[@]::1}
start=${latest//+([^[:digit:]])}
end=$(( ${#filesb[@]} + start + 1 ))

for pic in "${filesb[@]}"; do
  for ((n=start;n<=end;n++)); do
    echo mv -v "$pic"  DirectoryA/Photo-${n}.jpg
  done
done
  • 如果您认为输出正确,则删除echo
© www.soinside.com 2019 - 2024. All rights reserved.