Невідповідні результати за допомогою скорочення на виході ls


2

Я намагаюся зрозуміти, чому я отримую різний вихід з однієї і тієї ж команди, запущеної на одному файлі в терміналі (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

Справжня проблема полягає в тому, що ви намагаєтеся проаналізувати вихідls . Це ніколи не є хорошою ідеєю, і, як ви зауважили, може легко зламатися. Одного разу він навіть не портативний для всіх операційних систем. Розбір lsчасто є симптомом того, що потрібно робити щось інше, окрім роботи над цим (і це проблема XY ).

У будь-якому випадку, ви запитуєте:

Я намагаюся ізолювати розмір файлу.

Потім просто використовуйте wc -c:

wc -c < filename

Це дасть вам розмір файлу в байтах (на відміну від того, duякий дає вам блоки). Ви можете обрізати пробіл, підключивши до нього tr -d ' 'чи подібне.

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


1
Дякую. Це був справді випадок, коли я не міг побачити деревину для дерев, оскільки я був занадто зосереджений на тому, чому це не працює, а не як змусити його працювати.
yvf5rcuya4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.