好吧,这可能是一个措辞不好的标题,但我不太清楚如何写它。我要做的是浏览一大堆文件(没有扩展名)并确定它们是什么,然后添加适当的扩展名。
我发现了一个非常方便的Linux实用工具,名为'file'来帮助解决这个问题。我知道python语法比bash&更好awk,但是我有很多问题让第三方“python-magic”模块在我的机器上工作,所以我没有浪费时间,而是花时间尝试用bash / awk编写它。
我相信我非常接近,但是我的语法仍然有些问题,我不确定是什么。
以下是代码:
for i in *;
do file $i | awk '{
switch ($2) {
case $2 == 'TIFF':
mv $i "$i.tif"
case $2 == 'PDF':
mv $i "$i.pdf"
case $2 == 'ASCII':
mv $i "$i.txt"
case $2 == 'Rich':
mv $i "$i.rtf"
case $2 == 'gzip':
mv $i "$i.gz"
}
}';
done
我在某些测试txt文件中遇到的语法错误是:
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
awk: cmd. line:3: case $2 == TIFF:
awk: cmd. line:3: ^ syntax error
我看到了一些使用awk和sed进行文件重命名的其他有趣方法,但至少在我看来,与'file'结合使用时,这似乎是我技能水平的最佳方法。
如果有人可以帮我解决这些awk语法错误,那就太棒了。或者,在更通用的帮助意义上,如果您知道更好的方法来完成此任务,请分享:)
修改
我做了修改建议(固定引号,从每个案例中删除了比较运算符,添加了中断)。现在脚本运行没有错误,但没有任何文件被更改。它们仍然是无延伸的。我的测试文件都是ASCII,所以应该重命名为在末尾添加“.txt”。
为了测试并验证我用awk拉正确的字段我运行了这个小测试:
$ file test2 | awk '{printf $2}'
ASCII
所以$ 2是文件类型。关于它为什么不起作用的任何想法?
答案 0 :(得分:4)
此处不需要awk
:
for i in *; do
filetype=$(file $i)
case $filetype in
*TIFF*) ext="tif"
;;
*PDF*) ext="pdf"
;;
*ASCII*) ext="txt"
;;
*Rich*) ext="rtf"
;;
*gzip*) ext="gz"
;;
esac
echo mv "$i" "$i.$ext"
done
当输出看起来像要运行的一组安全命令时,您可以删除echo
以实际执行mv
命令。
答案 1 :(得分:3)
由于您的awk脚本用单引号括起来,因此在awk中使用双引号作为文字字符串。
所以
case $2 == 'TIFF'
应替换为:
case "TIFF"
答案 2 :(得分:2)
我认为语法应该是这样的:
case "TIFF":
mv $i "$i.pdf"
break
switch
语句已引用$2
,因此请勿在任何地方重复此操作。break
它只会通过并运行下一行。答案 3 :(得分:2)
您可能最好使用shell case
构造。以下内容可能对您有用:
for i in *;
do
type=$(file "$i" | awk '{print $2}')
case "$type" in
TIFF)
mv $i "$i.tif"
;;
PDF)
mv $i "$i.pdf"
;;
ASCII)
mv $i "$i.txt"
;;
Rich)
mv $i "$i.rtf"
;;
gzip)
mv $i "$i.gz"
;;
esac
done