Скрипт SH для перемещения файлов из одного каталога в другой в зависимости от имени файла - PullRequest
4 голосов
/ 27 сентября 2011

Я пытаюсь написать сценарий sh, который будет запускаться после завершения одной из моих загрузок.

Он должен найти конкретное имя файла в ~ / Downloads и переместить его в другой каталог в зависимости отна имя файла.

Т.е. я скачал последний эпизод Glee, имя файла:

glee_some_trash_files_always_have.mkv

Он должен быть перемещен в

~/TVshows/Glee/

Вот что я смог сделать:

#!/bin/bash

if filename in ~/Downoads; then
result=
if filename = *glee*; then
result= mv $filename ~/TVshows/Glee/
else
if filename = *pokemon*; then
result= mv $filename ~/TVshows/pokemon/
endif
done

Правильно ли подходит мой подход?Пожалуйста, обратите внимание, что я очень плохо знаком с sh.

Заранее спасибо.

###############################################################################

Редактировать: Вот мой сценарий, я надеюсь, что кто-то еще может найти его полезным:

#!/bin/bash

cd "$HOME/Downloads"
# for filename in *; do
find . -type f | while IFS= read filename; do # Look for files in all ~/Download sub-dirs
  case "${filename,,*}" in  # this syntax emits the value in lowercase: ${var,,*}  (bash version 4)
     *.part) : ;; # Excludes *.part files from being moved
     move.sh) : ;;
#    *test*)            mv "$filename" "$HOME/TVshows/Glee/" ;; # Using move there is no need to {&& rm "$filename"}
     *test*)           scp "$filename" "imac@imac.local:/users/imac/Desktop/" && rm "$filename" ;;
     *american*dad*)   scp "$filename" "imac@imac.local:/users/imac/Movies/Series/American\ Dad/" && rm "$filename" ;;
     *) echo "Don't know where to put $filename" ;;
  esac
done

Ответы [ 3 ]

7 голосов
/ 28 сентября 2011

Здесь полезен оператор оболочки case:

#!/bin/bash
cd "$HOME/Downloads"
for filename in *; do
  # this syntax emits the value in lowercase: ${var,,*}  (bash version 4)
  case "${filename,,*}" in
    glee*)    mv "$filename" "$HOME/TVshows/Glee/" ;;
    pokemon*) mv "$filename" "$HOME/TVshows/pokemon/" ;;
    *) echo "don't know where to put $filename";;
  esac
done
3 голосов
/ 04 февраля 2015

Это мой скрипт для последовательной сортировки.

#!/bin/bash

PATH_FROM=/your/download/dir
PATH_TO=/path/serial/directory

cd $PATH_FROM
ls -1 *{mkv,avi,srt,mp4} | sed -e 's/\.[s|S][0-9].*$//g' | uniq | while read -r serial
do
    folder=$(echo $serial | tr A-Z a-z) folder=${folder/the./}
    folder=`echo ${folder//_/.}`
    folder=`echo ${folder//./ }`

    folder=( $folder )
    folder=`echo "${folder[@]^}"`

    ls -1 ${serial// /.}.* | sed -e 's/'$serial'\.[s|S]//g' | sed -e 's/\..*$//g' | uniq | while read -r s
    do
        season=s$(echo "$s" | sed -e 's/[e|E].*$//g' | sed -e 's/^0//g')
        mkdir -p "$PATH_TO/$folder/$season"
        mv -f $serial.?$s* "$PATH_TO/$folder/$season/"
        log=`date +"[%d/%m/%Y %X]"`
        echo $log" "$serial" success sync with "$PATH_TO"/"$folder"/"$season >> /path/to/logfiledir/log.txt
    done
done
1 голос
/ 27 сентября 2011

Команда mv может перемещать несколько файлов одновременно. Последний аргумент обрабатывается как имя каталога. Трейлинг / важен; если существует одно совпадающее имя файла, а целевой каталог не существует (скажем, потому что вы его неправильно написали), он создаст его как файл.

mv ~/Downloads/*glee* ~/TVshows/Glee/
mv ~/Downloads/*pokemon* ~/TVshows/pokemon/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...