![将电影列表保存到 csv 的 Shell 命令](https://linux22.com/image/111425/%E5%B0%86%E7%94%B5%E5%BD%B1%E5%88%97%E8%A1%A8%E4%BF%9D%E5%AD%98%E5%88%B0%20csv%20%E7%9A%84%20Shell%20%E5%91%BD%E4%BB%A4.png)
我正在尝试编写一行 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'