我正在尝试在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
答案 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
扩展名。