Я намагаюся шукати файли, створені у червні, липні та серпні місяців. Я використовував цей метод
ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'
але це не працює.
Я намагаюся шукати файли, створені у червні, липні та серпні місяців. Я використовував цей метод
ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'
але це не працює.
Відповіді:
Ви можете зіставити декілька моделей, таких як:
awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)
Це повертає всі збіги для червня, липня або серпня. print
Виписка не потрібна, як це awk
дію за замовчуванням.
awk '/Jun|Jul|Aug/'
абоawk '/Ju[nl]|Aug/'
Як правило, дуже погана ідея проаналізувати вихід ls . Кращий спосіб зробити те, що ви хочете, - це
stat -c "%n %y" * | grep 2013-0[678]
Крім того, перевірте лише останнє поле для захисту від малоймовірного випадку, коли саме ім'я файлу є датою:
stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/'
Від man stat
:
-c --format=FORMAT
use the specified FORMAT instead of the default; output a new‐
line after each use of FORMAT
%y time of last modification, human-readable
%n file name
| awk '$NF ~ /2013-0[678]/'
щоб перевірити лише останнє поле виводу в (мабуть?) Навіть те, що ім'я файлу відповідає регексу навіть тоді, коли дата не відповідає.
ls
це команда для відображення інформації про файли, доступні для читання людиною. Не використовуйте це в сценаріях .
Команда на пошук файлів у дереві каталогів відповідає певним критеріям find
. Якщо у вас є GNU find (тобто невбудований Linux або Cygwin) або FreeBSD find (тобто FreeBSD або OSX), ви можете використовувати -newermt
для зіставлення файлів, востаннє змінених після певної дати.
find . -newermt '1 June' ! -newermt '1 September' -print
Додайте рік, якщо ви хочете відповідати файлам у конкретному році, а не календарному році, коли сценарій працює.
Якщо у вашій реалізації не знайдеться -newermt
, вам доведеться це зробити -newer
, який порівнює дату find
знайденого файлу з фіксованим файлом. використовувати touch
для створення тимчасових файлів із датою, яку ви хочете використовувати як межу.
dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
[...]
конструкція відповідає одному символу, який може бути будь-яким із символів між дужками. Отже, ваше вираження відповідаєJJA
абоJug
(J
від[Jun]
,u
від[Jul]
іg
від[Aug]
), але не абревіатури місяця, на які ви сподівалися відповідати.