Моя цель обманчиво проста (по крайней мере, для меня). Я хочу взять вывод ls -l
или ls -lh
и выбрать только одно поле.
Я ищу, чтобы это было как можно более пуленепробиваемым, и я имею в виду, что имена файлов могут иметь переменное количество пробелов, не все в поле имеют одинаковую длину и т. Д.
Бонусные баллы за наличие скрипта, который будет принимать имя поля (или даже просто номер поля), а затем возвращать содержимое поля.
Я хочу включить
в:
command-line
bash
soandos
источник
источник
ls
. Командаfind
чрезвычайно полезна.ls -l --block-size=M
?ls
команда не является стандартом POSIX, поэтому сценарий, который зависит от него,ls
может сломаться в разных системах или даже со временем. Смотрите ответ @ormaaj на этой странице для более подробной информации. Один из способов сделать то, что вы просите, - использовать цикл Bash. Вот пример.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
, Конечно, вместо тогоecho
, чтобы использовать вашу обработку.... | xargs -d '\n' du -m
которая работает так же хорошо.-exec
вариантfind
.Никогда не разбирай ls . Используйте GNU
find
. Или , если портативность не важно,stat(1)
.Для чтения данных, кроме списков имен файлов, построчно и разделения на поля, см .: BashFAQ / 001
Нет способов надежно прочитать список имен файлов, разделенных новой строкой, которые имеют смысл в большинстве случаев.
источник
Вы можете получить конкретный столбец в оболочке, например:
или ,
awk
как показано на @Corey ответ ,cut -c44-45
также будет работать после настройки (сls
закрепил столбцы), или что - то еще, однако основная проблема заключается в том , что он не будет надежным и пуленепробиваемые (например , на Unix может быть$6
, не$7
, и это изменяется в зависимости от аргументов), что делает его не дружественным к машине, поэтому вообще не рекомендуется разбиратьls
команду .Лучше всего использовать различные доступные команды, такие как
find
илиstat
, которые могут предоставить соответствующие опции для форматирования вывода, как вам нужно. Например:Чтобы вернуть столбец только дней изменений, попробуйте этот пример:
Стоит отметить, что GNU
stat
может иметь разные параметры по сравнению с BSDstat
, поэтому он не будет пуленепробиваемым в разных операционных системах.источник
stat
.date
однако настроен неправильно. Нужно добавить--date=$ymd
, такdate
как сам по себе напечатает текущий день, но цель здесь - преобразовать формат даты файлаls -la | cut -c32-33
Команда в полной честности просто совершенно ненадежна, а не только из - за возможные ошибки , с именами файлов, но просто потому , что это зависит от длины и от файлов имен пользователей и размера. Командаstat -c "%x" *.*
выглядит хорошо, но, используя*.*
ее, вы ограничиваете ее только именами файлов, содержащими точку. Я предполагаю, что намерение было поймать также скрытые файлы; в этом случае вы должны включить подстановку для заранее и составляют скрытые использовать*
вместо*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
вdate
команду, иначе она напечатает текущий день месяца.