Schmorrison
Schmorrison

Reputation: 194

Splitting text files in folder

I have been trying to make a shell script that will split text files one after the other through an entire folder and deposit every split chunk into another designated folder.

Here is what I have so far, I know its probably clunky(have never tried writing a .sh before):

#!/bin/bash
#File Split Automation

echo "Usage: split [Folder w/ Input] [Folder For Outputs] [Options] [PREFIX]
  Options: -b [sizeMB]: Split by size
  -l [No. of Lines]: Split by Lines
  If No Output Folder is Defined Default is Set To: /Desktop/splitter-parts
  If No Options Are Selected Default is Size=100MB"

inputdirc=$1
outputdirc=$2
spltion=$3
meastick=$4
prefixture=$5

if [ -d $1 ]
then
    echo "You Picked The Folder $1 To Split Files From"
    ls $1
else
    exit
fi

if [ -d $2 ]
then
    echo "Please Confirm Folder Path For Output $outputdirc"
else
    cd /root/Desktop/
    mkdir -p splitter-parts
fi



read -t 10 -p "Press Enter Or Wait 5 Sec. To Continue"


cd $2

for swordfile in $( ls $1); 
do
command -p split $3 $4 -a 3 -d $swordfile $5

done

Anything you see going wrong? Because I am not getting the output I desired, though it functioned fine when I just had a file and a folder in the split-command string.

EDIT::::

Sorry, I apologize. Just getting a bit ahead of myself.

This is what I am seeing when I run it:

root@kali:~/Desktop/Wordlists# ./splitter.sh '/root/Desktop/Wordlists'               '   /root/Desktop/Untitled Folder' s 100MB
Usage: split [Folder w/ Input] [Folder For Outputs] [Options] [PREFIX]
Options: -b [sizeMB]: Split by size
-l [No. of Lines]: Split by Lines
If No Output Folder is Defined Default is Set To: /Desktop/splitter-parts
If No Options Are Selected Default is Size=100MB
You Picked The Folder /root/Desktop/Wordlists To Split Files From
10dig10milup2.txt                     mixed.txt
10dig10miluplow2.txt                      movie-characters.txt
10dig10miluplow3.txt                      name1s.txt
((------------------CUT------------)
lower.lst                         xae2.txt
lower.txt                         xaf2.txt
mangled.lst                       xag2.txt
mangled.txt                       xah6.txt
misc-dictionary.txt
./splitter.sh: line 24: [: /root/Desktop/Untitled: binary operator expected
Press Enter Or Wait 5 Sec. To Continue
./splitter.sh: line 37: cd: /root/Desktop/Untitled: No such file or directory
split: extra operand `10dig10milup2.txt'
Try `split --help' for more information.
split: extra operand `10dig10miluplow2.txt'
Try `split --help' for more information.
split: extra operand `10dig10miluplow3.txt'
Try `split --help' for more information.
split: extra operand `10dig10miluplow4.txt'
Try `split --help' for more information.
...................MORE OF THE SAME.......

As far as what I am supposed to see, I haven't gotten that far yet, clearly I am missing some steps.

Upvotes: 0

Views: 1042

Answers (1)

glenn jackman
glenn jackman

Reputation: 246774

A quick rewrite with some notes to follow:

#!/bin/bash
#File Split Automation

usage="Usage: split [Options] [Folder w/ Input] [Folder For Outputs] [PREFIX]
  Options: -b [sizeMB]: Split by size
  -l [No. of Lines]: Split by Lines
  If No Output Folder is Defined Default is Set To: /Desktop/splitter-parts
  If No Options Are Selected Default is Size=100MB"

split_opt="-b 100MB"
while getopts hb:l: opt; do
    case $opt in
        h) echo "$usage"; exit ;;
        b) split_opt="-b $OPTARG" ;;
        l) split_opt="-l $OPTARG" ;;
    esac
done
shift $((OPTIND - 1))

if [[ $# -eq 0 ]]; then
    echo "$usage"
    exit 1
fi

inputdirc=$1
if [[ -d $inputdirc ]]; then
    ls $1
else
    echo "no such directory: $inputdirc" >&2
    exit 1
fi

if [[ -n $2 ]]; then
    outputdirc=$2
else
    outputdirc=/root/Desktop/splitter-parts
fi

prefixture=$3

mkdir -p "$outputdirc"
cd "$outputdirc"

for swordfile in "$inputdirc"/*; do
    command -p split $split_opt -a 3 -d "$swordfile" $prefixture 
done

Notes:

  • you generally want to quote all your variables. This is the cause of your error, because there was a file with whitespace and square brackets in the name.
  • I did not quote a couple in the split command because I specifically want the shell to perform word splitting on the values
  • since options are, well, optional, use getopts to collect them.
  • you store the positional parameters in variables, but you continue to use the positional parameters. Pick one or the other.

Upvotes: 2

Related Questions