I want to find a command line code or bash script to unrar all the files in subfolder. This is can be easily done by:
1
find Photos/ -name '*.rar' -execdir unrar e {} \;
However, this will output all unzipped files in current folder. Then I tried a script from here:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /bin/sh
# ref: http://bashscripts.org/forum/viewtopic.php?f=8&t=908
# ref : http://www.linuxquestions.org/questions/programming-9/unrar-multiple-files-into-seprated-directory-base-on-their-name-927127/
echo "starting unrar in folders"
# for everything named *.rar
for filename in *.rar
    do
        foldername=$(basename "$filename" .rar)
        echo $foldername
        mkdir "$foldername"
        cd "$foldername"
        unrar x ../"$filename"
        cd ..
    done
echo "finished unrar in folders"
Note that
cddoesn’t simply work in bash script if you call it like./cdscript. Instead, you can do. ./cdscript. See here for details.
Then I found this approach also has limitations since in my subdirectories, all zip files have same name, and all files in zip files have same names. Something like:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
subdirA
    - A.zip
        - a.csv
        - b.csv
        - c.csv
    - B.zip
        - a.csv
        - b.csv
        - c.csv
subdirB
- A.zip
    - a.csv
    - b.csv
    - c.csv
- B.zip
    - a.csv
    - b.csv
    - c.csv
...
Then I modified the script without cd, then it works perfectly!
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
for filename in $( find . -name '*.rar' )
    do
        foldername=${filename%.*}            # remove the rar suffix
        mkdir "$foldername"
        unrar e "$filename" "$foldername"    # unrar to a specific folder
        echo "------------分割线------------" # separating line
    done