我在一个目录中有1000个文件,我希望能够将它们分成子目录,每个子目录包含特定数量的文件。我不关心什么文件进入什么目录,只要每个文件包含一个特定的数字。所有文件名都有一个共同的结尾(例如.txt)但前面的内容会有所不同。
任何人都知道一种简单的方法。
答案 0 :(得分: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
这将创建目录subdirX
,其中X
是一个从0开始的整数,并将在每个目录中放置42个文件。
你可以调整为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
答案 1 :(得分: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
答案 2 :(得分:0)
怎么样
find *.txt -print0 | xargs -0 -n 100 | xargs -I {} echo cp {} '$(md5sum <<< "{}")' | sh
这将创建多个目录,每个目录包含100个文件。每个创建的目录的名称是它包含的文件名的md5哈希值。