dos2unix
также удаляет спецификации и преобразует UTF-16 в UTF-8:
$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182
dos2unix
также удаляет спецификации UTF-8:
$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61
-regex
( расширение GNU, также распознаваемое некоторыми другими find
реализациями в настоящее время, но с существенными отличиями )похоже на -path
, за исключением того, что оно использует регулярные выражения вместо подстановочных знаков. Он соответствует всему пути к файлу, а не только его имени.
Таким образом,.*\.log.*[0-9]
(нет необходимости в ^
или $
, между прочим, они неявно с find
-regex
)будут соответствовать ./dir/foo.log-3
, но также и ./foo.logic/file.bz2
, где .*
захвачен ic/file.bz
.
-name
соответствует только имени файла , использует подстановочные знаки, но не имеет аналога регулярного выражения. Здесь для файлов, имя которых содержит .log
и заканчивается цифрой, вам все равно не нужны регулярные выражения, -name '*.foo*[0-9]'
.
Вы можете сделать то же самое с регулярными выражениями, но с -regex '.*\.log[^/]*[0-9]'
, чтобы убедиться, что часть между .log
и последней цифрой не содержит /
, поэтому она совпадает только по имени файла.
С помощью -regex
вы можете пойти дальше в определении шаблонов, особенно если вы включите расширенные регулярные выражения, используя -E
с некоторыми BSD find
или -regextype posix-extended
с GNU find
.
find. -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E. -regex '.*\.log([.-][0-9]+)+' # BSD
Здесь сопоставление на .log
, за которым следует один или несколько .<number>
или -<number>
.
Без -regextype posix-extended
GNU find
регулярные выражения являются регулярными выражениями emacs , своего рода гибридом между стандартными базовыми регулярными выражениями и стандартными расширенными регулярными выражениями (поддерживает +
, но группировка с \(...\)
вместо (...)
).
Без -E
BSD find
регулярные выражения являются стандартными базовыми регулярными выражениями.
Попробуйте,
find. -type f -regex ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
.
Если после «log» есть только цифры, .
и -
, может работать следующее
find. -type f -regex ".*[.]log[-.0-9]*$"
Вы можете искать свои файлы, используя следующий способ, не прибегая кnon-GNU
find
:
find. -type f \
\( -name '?*.log.[0-9]' -o \
\( \
-name '?*.log.[0-9]*[0-9]' \
! -name '?*.log.?*[!0-9.-]*?' \
! -name '?*.log.?*[.-][.-]*?' \
\) \
\) \
-print;
Это выполняет многоуровневую -многоуровневую фильтрацию имен файлов, перехваченных им, и постепенно уменьшает улов и обнуляет требуемое. Если быть точным:
basename
, т. е. без пути, заканчивается на.log.single_digit
.log.
NUM
anything
NUM
Это установит тенденцию для имен файлов, которые будут пойманы в сети. non number, non dash, or non dot
в части anything
имени файла. Обратите внимание, что тенденция начала и окончания цифры должна соблюдаться. anything
состоит только из digit(s)
, dot(s)
и dash(s)
. Последнее ограничение состоит в том, что dot
или dash
не должны иметь непосредственных соседей как слева, так и справа. -name
рассматривает только базовую часть имени файла, И -name
работает на основе wildcard
и, следовательно, они неявно привязаны, что означает, что совпадающее имя является полным.