按名称对文件夹中的文件进行分组

按名称对文件夹中的文件进行分组

我有一个包含许多文件的文件夹,例如:

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 限定符。xy(#q.)

与使用循环执行的操作类似,只是zmv添加了一些健全性检查。

相关内容