我有一个包含许多文件的文件夹,例如:
20_1_A.xml,
20_2_A.xml,
20_3_A.xml,
...
10_1_A.xml,
10_2_A.xml,
10_3_A.xml,
...
20_1_A.csv,
20_2_A.csv,
20_3_A.csv,
...
10_1_A.csv,
10_1_A.csv,
10_3_A.csv,
...
我想使用 shell 命令按名称中的第一个数字对文件进行分组。例如:
- 名为 20 的文件夹中的所有以 20 开头的文件以及名为 10 的文件夹中的所有以 10 开头的文件。文件类型无关紧要。
有人知道如何做到这一点吗?我想过使用通配符,但我不知道如何......
答案1
通配符是正确的工具。您可以像这样移动所有文件:
for i in {10,20} # or something like $(seq 10 10 90) instead of {10,20} if you have a lot of different prefixes
do
mkdir -p "$i" &&
mv "$i"* "$i"/
done
如果目标目录已经存在,您希望mkdir -p
这样就不会抱怨。mkdir
答案2
for datei in *_*.xml *_*.csv;
do mkdir -p -- "${datei%%_*}" &&
mv -- "$datei" "${datei%%_*}"
done
对于与模式匹配的每个文件,创建一个由第一个下划线之前的部分命名的目录(如果它尚不存在,-p
则为选项)并将文件移动到那里。
希望这适合。
答案3
和zsh
:
mkdir_and_move() {mkdir -p -- $2:h && mv -- "$@"}
autoload zmv
zmv -P mkdir_and_move '(<->)*.(csv|xml)(#q.)' '$1/$f'
<->
是一个匹配任何十进制整数的 glob(是从到 的<x-y>
整数)。是一个仅选择常规文件的 glob 限定符。x
y
(#q.)
与使用循环执行的操作类似,只是zmv
添加了一些健全性检查。