我很困惑为什么在终端 (Mac OS X 10.6.8) 中对单个文件运行相同的命令时,输出结果与对多个文件运行的相同命令不同。我想在 bash 脚本中运行该命令,因此尝试在一次对一个文件运行时获得一致的结果。
给我带来问题的命令
ls -l "filename" | cut -f8 -d' '
我正在尝试隔离文件大小。
这似乎适用于没有扩展权限的文件(例如第一个字段为“-rw-r--r--”),但对于具有扩展权限的文件(例如第一个字段为“-rwxrwxrwx@”),我需要 cut -f7 -d' '
有趣的是,如果我选择每种类型的文件并运行:
ls -l "filename1" "filename2" | cut -f8 -d' '
它返回文件大小两个都文件没有问题。我不明白为什么会发生这种情况……但当然在我的脚本中我每次只处理一个文件。
我尝试使用 sed 删除双倍的空格和双倍的制表符,这确实改变了给出文件大小所需的字段编号,但它似乎仍然给出取决于是否有扩展文件权限的结果。
我从脚本中加入了 while 循环以供参考,但它不容易读取,因为文件大小只是我插入的 4 个冒号分隔的字段之一。
#!/bin/bash
# lots of other stuff here including specifying input (which is a list of filenames with complete paths) and output files ...
while IFS= read -r line
do
echo "$line":`exiftool -all= -o - "$line" | md5`:`md5 "$line" | cut -f2 -d'=' | sed -e 's/^[ \t]*//'`:`ls -l "$line" | cut -f8 -d' '` >> "$outputfile"
done < "$file"
有人能帮我解释一下吗?
答案1
真正的问题是你试图解析输出ls
。 这是绝不一个好主意,但正如你所观察到的,它很容易被打破。有一次,它甚至不能跨操作系统移植。解析ls
通常是需要做其他事情而不是绕过它(这是一个XY问题)。
无论如何,你问的是:
我正在尝试隔离文件大小。
然后只需使用wc -c
:
wc -c < filename
这将为您提供文件大小(以字节为单位)(而不是为您提供块)。您可以通过管道或类似方式du
修剪空格。tr -d ' '
作为循环的一个小提示:不要使用反引号来执行命令替换,而是帮自己一个忙并使用$()
,例如$(md5 "$line" | cut -f2 -d'=' | sed -e 's/^[ \t]*//')
。这有各种优点,包括提高可读性和减少嵌套此类命令时的麻烦。