映画リストをcsvに保存するシェルコマンド

映画リストをcsvに保存するシェルコマンド

映画のリストをCSVファイルに保存するために1行のシェルコマンド(bash)を作成しようとしています。必要に応じてスクリプトを使用できます。

私のフォルダのレイアウトは次のとおりです。

    -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'

関連情報