1

Я изо всех сил пытаюсь понять, почему я получаю разные выходные данные из одной и той же команды, запущенной для одного файла в терминале (Mac OS X 10.6.8), и для нескольких файлов. Поскольку я хочу выполнить команду в скрипте bash, я пытаюсь получить согласованные результаты при запуске одного файла за раз.

Команда, дающая мне проблему

ls -l "filename" | cut -f8 -d' '

Я пытаюсь выделить размер файла.

Кажется, что это работает для файлов без расширенных разрешений (например, первое поле "-rw-r - r--"), но для файлов с расширенными разрешениями (например, первое поле "-rwxrwxrwx @") мне нужно вырезать -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 ответ1

1

Настоящая проблема в том, что вы пытаетесь проанализировать вывод ls. Это никогда не хорошая идея, и, как вы заметили, может легко сломаться. На этот раз он даже не переносим между операционными системами. Синтаксический анализ ls часто является признаком необходимости делать что-то еще, но обходить его (и это проблема XY).

Во всяком случае, вы спрашиваете:

Я пытаюсь выделить размер файла.

Затем просто используйте wc -c:

wc -c < filename

Это даст вам размер файла в байтах (в отличие от du который дает вам блоки). Вы можете обрезать пробел, добавив в tr -d ' ' или аналогичный.

Небольшой совет для вашего цикла: вместо использования обратных кавычек для подстановки команд сделайте себе одолжение и используйте $() , например, $(md5 "$line" | cut -f2 -d'=' | sed -e 's/^[ \t]*//') . Это имеет различные преимущества, в том числе повышенную читаемость и меньше головной боли при вложении таких команд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .