Bash 使用 find -exec 重命名 360 000 个文件

Bash 使用 find -exec 重命名 360 000 个文件

我有大约 360 000 个文件,例如:

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

我想使用rename例如从 *.jpg 重命名文件到 *.jpeg。我无法使用 single 来做到这一点rename,因为我收到错误参数列表太长。

在寻找解决方案时,我发现了这一点,但它没有重命名任何内容:

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

当我检查是否{}已扩展时,用 echo 替换重命名:

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

我得到预期的结果:

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

如果我运行任何这些重命名命令,我就会重命名工作。所以应该是 的问题{}

谢谢你的帮助!

答案1

在第一个实例中,在*到达之前由 shell 展开rename(如果它完全展开 - 我怀疑是否有任何匹配{}/*),如果它没有展开,则执行的命令带有rename三个参数-n,s/jpg/jpeg/some/path/*。最后一个参数不是现有文件的名称,因此rename不执行任何操作。

如果没有 shell 通配符,该路径对于rename.

因此,请执行以下操作:

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

find尽可能使用来构建命令行的能力+,而不是;

答案2

find  | prename 's/\.jpg$/.jpeg/'

或者如果当前目录中有 order 文件

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

答案3

type d除非您只想重命名目录,否则不应指定。要更改扩展名.jpg.jpeg尝试

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

echo如果您喜欢屏幕上看到的内容,请删除。

答案4

使用 cygwin,我的重命名版本没有正则表达式替换,它的rename [options] expression replacement file...语法似乎也不起作用。此外,bash 建议失败

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

唉...总是有perl:

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

相关内容