【发布时间】:2020-04-15 18:43:38
【问题描述】:
我相信有一些类似的帖子,如果我在这方面做得更好,我可以找出我自己问题的答案(This one 和 this one)。
我有一台 Mac,并且正在使用终端中的 setfile 命令,该命令对单个文件非常有效。
setfile -d "08/02/2001 00:00:00" X-09-04.m4v
但是,我有数百个视频可以处理。我有一个文件 changedate.csv 文件,其中所有日期和相关文件名位于两个单独的列中(屏幕截图)。 csv 格式如下:
datenew,id
12/19/1998 12:00:00 AM,X-01/X-01-01.m4v
12/31/1998 12:00:00 AM,X-01/X-01-02.m4v
12/31/1998 12:00:00 AM,X-01/X-01-03.m4v
然后我创建了 changedate.sh 脚本,如下所示:
#!/bin/bash
cat changedate.csv | while IFS=, read datenew id;
do
echo 'setfile -d "$datenew" $id'
done
命令 setfile 要求日期字符串需要用引号引起来。这让我很困惑,因为当我从终端运行 sh changedate.sh 脚本时,它会打印出来如下:
setfile -d "$datenew" $id
setfile -d "$datenew" $id
setfile -d "$datenew" $id
....
如果我删除变量周围的引号,它会正确读取 csv,输出如下所示:
setfile -d 12/19/1998 00:00:00 X-01/X-01-01.m4v
setfile -d 12/31/1998 00:00:00 X-01/X-01-02.m4v
setfile -d 12/31/1998 00:00:00 X-01/X-01-03.m4v
...
这几乎是正确的,但它不起作用,因为日期字符串没有用引号括起来,这是必需的。最终输出应如下所示:
setfile -d "12/19/1998 00:00:00" X-01/X-01-01.m4v
setfile -d "12/31/1998 00:00:00" X-01/X-01-02.m4v
setfile -d "12/31/1998 00:00:00" X-01/X-01-03.m4v
...
我想我需要使用反斜杠来让变量与引号一起打印,但我不太明白。感谢您的帮助!
【问题讨论】:
-
为什么要回显
setfile命令而不是执行它? -
setfile本身不需要(或看到)引号;这些只是为了保护日期和时间之间的空间不被分词。如果您打算实际运行该命令,setfile -d "$datenew" "$id"就是您所需要的。
标签: bash csv variables terminal escaping