nerdy tidbits*

一行代码提取所有子文件夹特定类型文件

2021.07.01

有网友发来求助:

将选定文件夹下层的多个子文件夹中的图片(有重名)都移动到母文件夹中,并将他们按“指定文件夹名称+序号”形式重命名。

这个用 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