Comando shell para salvar lista de filmes no csv

1

Estou tentando escrever um comando shell de uma linha (bash) para salvar uma lista de filmes em um arquivo CSV. Eu estou bem com o uso de um script, se necessário.

Minhas pastas estão dispostas da seguinte forma:

    -Movies/
    --A/
    ----After Earth (2013).mkv
    --B/
    ----Batman (1989).mkv

Usando este comando:

     ls Movies/* | grep '.mkv' | cut -d. -f1

Isso me fornece uma lista de filmes que eu sei que são do tipo MKV.

    12 Monkeys (1995)
    2001 - A Space Odyssey (1968)
    A Million Ways To Die In The West (2014)
    A Series of Unfortionate Events (2004)
    Bad Company (2002)

Eu gostaria, no entanto, de acabar com um arquivo CSV com a seguinte aparência:

    MOVIE_NAME, MOVIE_YEAR, FILE_TYPE, CREATED_DATE (YYYY-MM-DD)

Talvez algo envolvendo sed ou awk seja necessário?

    
por Matthew Kelley 14.05.2017 / 04:51

2 respostas

2

Este script assume que todos os arquivos estão no formato da pergunta.

#!/bin/sh
#
# Important! This assumes all files are in the following format:
#
# Movies/A/After Earth (2013).mkv
# Movies/B/Batman (1989).mkv
# Movies/C/Carry On Sergeant (1958).mkv"

raw='find ./Movies -type f -name \*.mkv'
# Field split on line return
IFS="
"
for m in $raw
do
    fDate='stat -f %Sm -t %Y-%m-%d "$m"'
    fName=${m##*/}
    fExt=${m##*\.}
    # Assume every movie is in "Name of Film (YYYY).mkv" format
    movie=${fName%% (*}
    mYear=${fName%%)*}
    mYear=${mYear##*(}
    echo "\"${movie}\", \"${mYear}\", \"${fExt}\", \"${fDate}\""
done

exit

E o resultado deve ser assim:

"After Earth", "2013", "mkv", "2017-05-14"
"Batman", "1989", "mkv", "2017-05-14"
"Carry On Sergeant", "1958", "mkv", "2017-05-14"
    
por 14.05.2017 / 09:06
1

Assumindo por data de criação , você quer dizer a hora da última modificação do arquivo (conforme relatado por ls -l ), então com GNU find , você poderia fazer (aqui usando formato CSV do RFC 4180 ):

find . -regextype posix-extended \
       -regex '.*\([0-9]{4}\)\.[[:alnum:]]+' \
       -type f \
       -printf '%TF/%f
find . -regextype posix-extended \
       -regex '.*\([0-9]{4}\)\.[[:alnum:]]+' \
       -type f \
       -printf '%TF/%f%pre%' |
  perl -l -0pe '
    s/"/""/g;
    s{(.*)/(.*?)\s*\((\d{4})\)\.([^.]*)$}{"$2",$3,$4,$1\r}s'
' | perl -l -0pe ' s/"/""/g; s{(.*)/(.*?)\s*\((\d{4})\)\.([^.]*)$}{"$2",$3,$4,$1\r}s'
    
por 14.05.2017 / 19:49