使用 cut 对 ls 的输出进行处理时,结果不一致

使用 cut 对 ls 的输出进行处理时,结果不一致

我很困惑为什么在终端 (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]*//')。这有各种优点,包括提高可读性和减少嵌套此类命令时的麻烦。

相关内容