将电影列表保存到 csv 的 Shell 命令

将电影列表保存到 csv 的 Shell 命令

我正在尝试编写一行 shell 命令 (bash) 将电影列表保存到 CSV 文件。如果需要的话我可以使用脚本。

我的文件夹布局如下:

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

使用这个命令:

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

这为我提供了我所知道的 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)

不过,我最终希望得到一个如下所示的 CSV 文件:

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

也许需要涉及 sed 或 awk 的东西?

答案1

该脚本假设所有文件均采用问题中的格式。

#!/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

结果应该是这样的:

"After Earth", "2013", "mkv", "2017-05-14"
"Batman", "1989", "mkv", "2017-05-14"
"Carry On Sergeant", "1958", "mkv", "2017-05-14"

答案2

假设由创建日期,你的意思是文件的最后修改时间(由 报告ls -l),然后使用 GNU find,你可以这样做(这里使用RFC 4180CSV 格式):

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

相关内容