如何使用bash将未知数量的源文件名拆分为指定数量的输出文件

时间:2016-07-28 13:07:41

标签: linux bash shell scripting sh

我正在尝试在BASH中编写一个脚本,该脚本将读取源目录中具有未知文件计数的所有文件名,然后在指定数量的输出文件之间尽可能均匀地分割这些名称。用户输入是源目录,目标目录和目标文件计数。

例如,假设我们在源目录中有10个文件,并且用户指定他们希望将这些文件的名称分成3个输出文件。

来源文件名称:

test
test2
test3
test4
test5
test6
test7
test8
test9

结果文件:

FILE1
test
test2
test3
test4

(已经4)

FILE2
test5
test6
test7

(已经3)

FILE3
test8
test9
test10

(已经3)

到目前为止,我已经提出了以下内容,它将始终捕获所有文件,因为我强行进行了一次向上搜索,但不会提供所需的输出文件数量因为它没有考虑输出文件中文件名数量的不均匀。

ls -l -d -1 $source/{*,.*} | tail -n +3 |  awk '{printf "%s\n",$9}' > hdpLoadList
fileCount=`ls -1 $source | wc -l`
threadCount=$3 

fptf=$(bc <<< "scale=1;($fileCount/$threadCount)+.9")
fptf=${fptf:0:1}

sPos=1
sLen=$fptf
for i in `seq 1 $threadCount`;
 do
   sed -n ${sPos},${sLen}p hdpLoadList | sed -e ':a;N;$!ba;s/\n/ /g' > hdpLoadP_$i
   sPos=$(($sPos+$fptf))
   sLen=$(($sLen+$fptf))
 done

1 个答案:

答案 0 :(得分:1)

脚本,让我们说split

#!/bin/bash

# Create an array with all the files
myArray=("$1"/*)

# Get array length
arrayLength=${#myArray[@]}

# Divide length by the third arg value
divRes=$(( $arrayLength / $3 ))

# Iterate through array using a counter
for ((i=0; i<${#myArray[@]}; i++)); do
    count=$(( $i / $divRes ))
    # Use basename to remove folder path
    echo `basename "${myArray[$i]}"` >> "$2/destFile$count"
done

用法:

bash split srcFolder destFolder 3

修改:在Charles Duffy评论后,我删除了脚本文件名的.sh扩展名。