有网友发来求助:
将选定文件夹下层的多个子文件夹中的图片(有重名)都移动到母文件夹中,并将他们按“指定文件夹名称+序号”形式重命名。
这个用 Applescript 我不知道怎么弄,但用 bash 就很简单了。
就这么一行代码:
n=1; for f in */*.jpg; do mv "$f" "$(printf "%02i_%s" "$n" "${f/\//_}")"; ((n++)); done
比如这样一个文件结构的文件夹内:
├── test1
│ ├── xxx.jpg
│ ├── xxx.txt
│ └── yyy.jpg
├── test2
│ ├── aaa.jpg
│ └── xxx.txt
└── test3
├── xxx.jpg
└── xxx.txt
运行一下这行代码,就成了:
├── 01_test1_xxx.jpg
├── 02_test1_yyy.jpg
├── 03_test2_aaa.jpg
├── 04_test3_xxx.jpg
├── test1
│ └── xxx.txt
├── test2
│ └── xxx.txt
└── test3
└── xxx.txt
拆解一下
这行代码很简单,运行的时候,只需要打开系统自带的 Terminal,cd
到你需要提取文件的子文件夹的父文件夹(parent folder),然后输入这行命令即可。
n
就是文件名里的那个 counter 。for f in */*.jpg
是一个 for loop,会遍历所有子文件夹中 jpg 格式的文件(如果是其他格式改成相应扩展即可)。${f/\//_}
这段正则表达式会把路径中的斜杠替换成 dash 。
就这样。使用起来就是:
cd ~/Pictures/test
n=1; for f in */*.txt; do mv "$f" "$(printf "%02i_%s" "$n" "${f/\//_}")"; ((n++)); done
要把这些文件提取到新的文件夹也很简单,先创建一个文件夹,然后修改 mv 命令后半段即可。
mkdir ~/Pictures/test/newfolder
n=1; for f in */*.txt; do mv "$f" newfolder/"$(printf "%02i_%s" "$n" "${f/\//_}")"; ((n++)); done