Файл списка в macos с форматированной датой и временем (эквивалентно find -printf в linux) - PullRequest
0 голосов
/ 03 марта 2020

Я хочу перечислить все файлы, которые заканчиваются расширением (.xyz) с соответствующей датой-временем (создано / обновлено).

У меня есть это на linux:

find ~/path/to/files -name "*.xyz" -type f -printf '%TF_%TT %p\n'

Result:
03-03-2020_01:01:01 /path/to/files/file1.xyz
03-03-2020_01:01:02 /path/to/files/file2.xyz

Однако, printf не поддерживается в macOs. Есть ли другой способ достичь этого умения без установки какой-либо третьей стороны?

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

В OSX вы можете использовать эту команду find + stat + date в bash:

while IFS= read -rd '' f; do
    date -r $(stat -f '%m' "$f") '+%d-%m-%Y_%T'$'\t'"$f"
done < <(find ~/path/to/files  -type f -name '*.xyz' -print0)
0 голосов
/ 03 марта 2020

Я знаю, что вы не предусмотрели никакой третьей стороны, но, поверьте мне (случайный человек на линии rnet), это сделает вашу жизнь намного проще. Сделайте себе большую услугу: если вы еще этого не сделали, go установите homebrew.

После установки используйте его для установки всего лишь нескольких вещей:

brew install bash colordiff cowsay gcc gdb glib gmp gnu-getopt gnu-sed gnu-tar gnu-time gnu-which gnupg gnutls grep lynx netcat pcre2 perl
readline vim wget xz coreutils findutils binutils

Все они должны быть установлены как символические ссылки от /usr/local/Cellar/[...] до /usr/local/bin, но некоторые из них устанавливаются с g префикс. Если это не то, что вам нужно, просто переименуйте ссылки без g, например:

mv /usr/local/bin/gfind /usr/local/bin/find

Последнее, обновите свой профиль, чтобы сначала поставить /usr/local/bin:

echo 'export PATH=/usr/local/bin:$PATH' >> $HOME/.bash_profile

Теперь find (и многие другие инструменты) будут работать как положено.


Объяснение: Apple поставляет macOS с BSD-версиями многих инструментов CLI. Некоторые инструменты не имеют версии с лицензией в стиле BSD; в этом случае они находят версию, лицензированную по GPLv2 (например, bash 3.x от 2007 года, которая, вероятно, используется вами, если она никогда не была намеренно обновлена). Они, очевидно, обеспокоены «инфекционной» природой GPLv3. Выполнение того, что я предложил, оставит вас с хорошими современными версиями инструментов CLI для GNU, и ваша командная строка будет намного больше похожа на ту, к которой вы привыкли в Linux.

0 голосов
/ 03 марта 2020

Не могли бы вы попробовать, используя команду stat с find и awk здесь .. Так как у меня нет ma c, поэтому я не смог проверить его.

find -type f -iname "*.xyz" -exec stat {} \+ |
awk -F'[ .]' '/File:/{match($0,/\/[^\047]*/);file=substr($0,RSTART+1,RLENGTH-1);next} /Modify:/{print $2,$3,file;file=""}'

Объяснение:

  • Запуск команды find для всех файлов с расширением xyz.
  • Запуск stat команда с exec для запуска команды stat для всех файлов, которые были получены в результате выполнения команды find.
  • Теперь передача вывода команды find команде awk в качестве входных данных.
  • При анализе данных и печати изменяются только временные параметры файлов и их имена в соответствии с вопросом OP.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...