簡體   English   中英

將目錄中的文件分配給子目錄

[英]assigning files in a directory to sub-directories

我的目錄中有1000多個文件,我希望能夠將它們划分為子目錄,每個子目錄都包含特定數量的文件。 我不在乎什么文件進入什么目錄,只要每個文件包含一個特定的數字即可。 所有文件名都有一個公共的結尾(例如.txt),但之前的內容有所不同。

任何人都知道執行此操作的簡單方法。

假設您只有*.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
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

怎么樣

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

這將創建幾個目錄,每個目錄包含100個文件。 每個創建的目錄的名稱是其包含的文件名的md5哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM