我试图在一个巨大的图像文件夹中重命名文件,其中包含许多子文件夹,其中包含图像。
这样的事情:
ImageCollection/
January/
Movies/
123123.jpg
asd.jpg
Landscapes/
qweqas.jpg
February/
Movies/
ABC.jpg
QWY.jpg
Landscapes/
t.jpg
我想运行脚本并按升序重命名,但将它们保存在相应的文件夹中,如下所示:
ImageCollection/
January/
Movies/
0.jpg
1.jpg
Landscapes/
2.jpg
February/
Movies/
3.jpg
4.jpg
Landscapes/
5.jpg
到目前为止,我有以下内容:
#!/usr/bin/env bash
x=0
for i path/to/dir/*/*.jpg; do
new=$(printf path/to/dir/%d ${x})
mv ${i} ${new}
let x=x+1
done
但是我的问题依赖于无法将文件保存在相应的子文件夹中,而是将所有内容移动到path/to/dir
根文件夹。
答案 0 :(得分:1)
纯粹的Bash解决方案(当然除了mv
之外):
#!/bin/bash
shopt -s nullglob
### Optional: if you also want the .JPG (uppercase) files
# shopt -s nocaseglob
i=1
for file in ImageCollection/*/*.jpg; do
dirname=${file%/*}
newfile=$dirname/$i.jpg
echo mv "$file" "$newfile" && ((++i))
done
这不会执行重命名,只显示将要发生的事情。如果您对所看到的结果感到满意,请移除echo
。
您也可以-n
使用mv
选项,以免覆盖现有文件。 (我肯定会在这种情况下使用它!)。如果-n
不可用,您可以使用:
[[ ! -e $newfile ]] && mv "$file" "$newfile" && ((++i))
对于包含空格或其他有趣符号的文件名(或dirnames),这是100%安全的。
答案 1 :(得分:0)
#!/bin/bash
x=0
for f in `find path_to_main_dir_or_top_folder | grep "\.jpg$"`;
do
mv $f $(dirname $f)/$x.jpg && ((x++))
done
echo shenzi