[#] Porządkujemy pliki - magiczny folder

( Ostatnio zmieniony czw., 10/07/2008 - 20:14 )
 

MAGIC FOLDER

magic_folder.sh

#!/bin/bash


if [ $# -lt 2 ]; then
  echo  "
  You should type:

     $0 [DIR NAME] [OPERATION]

     Operations:
      c = copy
      m = move
      l = create symbolic link

     Examples:
        $0 my_big_ugly_folder l
        $0 my_big_ugly_folder c
        $0 my_big_ugly_folder m
  "
  exit 0
fi

case "$2" in
  c)
    OP="cp"
    OPP=""
    T="copied"
    ;;
  m)
    OP="mv"
    OPP=""
    T="moved"
    ;;
  l)
     OP="ln -s"
     OPP="$( pwd )/"
     T="linked"
     ;;
  *)
    usage
    exit 0
    ;;
esac

DIR="$1"
DST="MAGIC FOLDER"
# for unique name if file exists
#t=`date +%d-%m-%Y-g-%H-%M-%S`

# List file ext and create directories
find "$DIR" -depth -type f | sed -e 's/.*\.//' | tr 'A-Z' 'a-z' | sort -u | uniq | while read ext
do
  # create not existing dirs
  mkdir -p "$DST/$ext"

  i=0
  # Start moving files into dirs
  echo "====== Working with files \"*.$ext\""
  find "$DIR" -depth -type f -iname "*.$ext" | grep -v -w ^d | while read filename
  do
    name=$(basename "$filename")
    if [ -e "$DST/$ext/$name" ]; then
      i=`expr $i + 1`
      fixname=$i."$name"
      echo "File $filename already exists, renaming to $DST/$ext/$fixname"
      $OP $OPP"$filename" "$DST/$ext/$fixname"
    else
      $OP $OPP"$filename" "$DST/$ext"
      echo "$filename has been $T to $DST/$ext"
    fi
  done
done

Użycie

./magic_folder.sh

  You should type:

     ./magic_folder.sh [DIR NAME] [OPERATION]

     Operations:
      c = copy
      m = move
      l = create symbolic link

     Examples:
        ./magic_folder.sh my_big_ugly_folder l
        ./magic_folder.sh my_big_ugly_folder c
        ./magic_folder.sh my_big_ugly_folder m

INNE WERSJE ALPHA

UWAGA – to są wersje alpha ! używasz na własną odpowiedzialność!

magic_folder.sh

#!/bin/bash

# config
MASTER_DIR=~/MAGIC_FOLDER

# file log - set to empty string for no log
LOGFILE="$MASTER_DIR/magic_folder.log"


# helper function to move file
function move_file {
  # make lowercase extension
  EXT_LOW=`echo $filename | sed -e 's/.*\.//' | tr 'A-Z' 'a-z'`

  # check dir
  if [ ! -d "$MASTER_DIR/$EXT_LOW" ]; then
    mkdir -p "$MASTER_DIR/$EXT_LOW"
  fi


  # move file
  echo "$filename" "$MASTER_DIR/$EXT_LOW"

  # if log then make log file
  if [ ! -z "$LOG" ]; then
    echo "File: $filename was moved to: $MASTER_DIR/$EXT_LOW" >> "$LOGFILE"
  fi
}


# until exists args
while [ $# -ge 1 ]; do

    # lowercase filename
    filename=`echo "$1" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`

    # normal case filename
    # filename="$1"

    # collect extensions
    case "$filename" in

        # here you can add more extensions
        *.mp3 | *.jpg | *.jpeg | *.gif | *.odt | *.txt )
            move_file
            ;;

        *)
          echo "$filename not moving"
          ;;
    esac
    shift
done

Użycie:
magic_folder.sh file.mp3 file.jpg otherfile.odt

Niech będzie zagadką dla Ciebie, co robi powyższy skrypt :) Jeśli już wymyślisz i zastosujesz, podziel się swoimi uwagami lub ulepszeniami.

Inna wersja – rekursywna

magic_folder.sh

#!/bin/bash

function usage {
  echo  "
  You should type:

     $0 [baddirname] [extenstion]

     Example: $0 mybaddir mp3
  "
}

if [ $# -lt 2 ]; then
  usage
  exit 0
fi

MASTER_DIR=~/MAGIC_FOLDER
BAD_DIR=$1
EXT=$2
LOGFILE="$MASTER_DIR/magic_folder.log"

mkdir -p "$MASTER_DIR/$EXT"

for i in $( ls -R "$BAD_DIR" | grep -i *."$EXT" ); do
  mv "$i" "$MASTER_DIR/$EXT"
  echo "File: $i was moved to: $MASTER_DIR/$EXT" #>> $LOGFILE
done

Użycie:
magic_folder.sh baddir mp3

Twoja ocena: Brak Średnio: 5 (2 głosy)

Odpowiedzi : 2

Ostatni komentarz : śr., 13/08/2008 - 13:46

Magiczny skrypt działa wyśmienicie! Rewelacja – bardzo przydatne przy porządkowaniu danych na dysku.

Pozdrawiam :) Marta

ls == word splitting
nie warto go używać w skryptach

Dodaj nową odpowiedź

Informacja:

Osoby zamieszczające wypowiedzi naruszające prawo lub prawem chronione dobra osób trzecich, mogą ponieść z tego tytułu odpowiedzialność karną lub cywilną. Upewnij się, że twoja wypowiedź nie godzi w niczyje mienie.

  • Internal paths in single or double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or path. Paths to files in single or double quotes, written as "files:somefile.ext", for example, are replaced with the appropriate URL that can be used to download the file.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <strong> <blockquote> <code>
  • Znaki końca linii i akapitu dodawane są automatycznie.

Więcej informacji na temat formatowania

Łapirobot
Proszę odpowiedzieć
Q
C
w
5
C
D
w
L
L
G
Enter the code without spaces and pay attention to upper/lower case.