2

我在一个目录中有 1000 个文件,我希望能够将它们分成子目录,每个子目录包含特定数量的文件。我不在乎什么文件进入什么目录,只要每个文件包含一个特定的数字。所有文件名都有一个共同的结尾(例如 .txt),但之前的内容有所不同。

任何人都知道一个简单的方法来做到这一点。

4

3 回答 3

3

假设您只有以 结尾的文件*.txt,没有隐藏文件和目录:

#!/bin/bash
shopt -s nullglob

maxf=42

files=( *.txt )

for ((i=0;maxf*i<${#files[@]};++i)); do
    s=subdir$i
    mkdir -p "$s"
    mv -t "$s" -- "${files[@]:i*maxf:maxf}"
done

这将创建一个从 0 开始的整数目录,并将在每个目录中放置 42 个文件subdirXX

您可以调整事物以填充零X

#!/bin/bash

shopt -s nullglob

files=( *.txt )
maxf=42
((l=${#files[@]}/maxf))
p=${#l}

for ((i=0;maxf*i<${#files[@]};++i)); do
    printf -v s "subdir%0${p}d" "$i"
    mkdir -p "$s"
    mv -t "$s" -- "${files[@]:i*maxf:maxf}"
done
于 2013-11-12T18:20:14.633 回答
2
max_per_subdir=1000
start=1
while [ -e $(printf %03d $start) ]; do
  start=$((start + 1))
done
find -maxdepth 1 -type f ! -name '.*' -name '*.txt' -print0 \
| xargs -0 -n $max_per_subdir echo \
| while read -a files; do
  subdir=$(printf %03d $start)
  mkdir $subdir || exit 1
  mv "${files[@]}" $subdir/ || exit 1
  start=$((start + 1))
done
于 2013-11-12T18:21:03.170 回答
0

怎么样

find *.txt -print0 | xargs -0 -n 100 | xargs -I {} echo cp {} '$(md5sum <<< "{}")' | sh

这将创建几个目录,每个目录包含 100 个文件。每个创建的目录的名称是它包含的文件名的 md5 哈希。

于 2013-11-12T19:00:04.367 回答