-name
procura o padrão. Colchetes significa OR para o que está dentro.
find . -type f -name 'ABC1[23]*'
Oi eu tenho a lista de arquivos começando com séries como ABC1 *, ABC12 * e ABC13 * ABC14 * série ...
Eu quero pegar a lista de ABC12 * e ABC13 * com o comando find
Estou usando o comando abaixo, mas não consigo extrair resultados exatos.
ls -ltr |grep -e "ABC12" |find . -type f -mtime 15
-name
procura o padrão. Colchetes significa OR para o que está dentro.
find . -type f -name 'ABC1[23]*'
Observe que -mtime 15
significa "cuja idade arredondada para a próxima unidade de 24 horas é 15" , ou seja, arquivos modificados entre 14*24
horas atrás e 15*24
horas atrás (nota que não estamos falando de dias aqui como em muitos fusos horários, você tem um dia de 23 horas e um dia de 25 horas por ano). Supondo que seja o que você quer, com zsh
, você poderia fazer:
ls -lrtd -- **/ABC1[23](D.m15)
Ou:
find . -type f -name 'ABC1[23]' -mtime 15 -exec ls -lrtd {} +
No entanto, observe que, se o número de arquivos exceder o tamanho máximo dos argumentos e do ambiente passado a um comando, o primeiro falhará, enquanto o segundo causará várias instâncias de ls
a serem executadas e, portanto, a lista não será estar na ordem de tempo conforme solicitado com -t
.
Com zsh
e% GNUls
, você pode contornar isso com:
autoload zargs
zargs -- **/ABC1[23](D.m15Om) -- ls -lUd
Ou seja, deixe zsh
fazer a classificação e passar a lista para uma ou mais invocações ls
, conforme necessário, mas informando ls
para não classificar a lista. Para outras implementações de ls
, você pode substituir o U
por rt
para permitir outra ordenação inútil, porém inofensiva.
Se você quiser um intervalo como ABC17
- > ABC23
em vez de apenas ABC12
, ABC13
, com zsh
, você faria:
ls -lrtd -- **/ABC<17-23>(D.m15)
(observe que ABC<17-23>
corresponde a ABC17
mas também ABC0000017
. Se isso for um problema, altere <17-23>
para (<17-23>~^??)
( extendedglob
opção necessária para o operador pattern~exclude
glob) para garantir isso corresponde apenas a números de 2 dígitos ou (<17-23>~0*)
para excluir números com 0 inicial.
Se o arquivo cujo nome é iniciado com ABC12
em vez de for ABC12
, você faria
ls -lrtd -- **/ABC<17-23>*(D.m15)
Mas, em seguida, observe que isso também corresponderia à ABC170. Para evitar isso:
setopt extendedglob
ls -lrtd -- **/ABC<17-23>^[0-9]*(D.m15)
Ou seja, <17-23>
seguido por qualquer coisa, menos algo que comece com um dígito decimal.
O find
equivalente (embora não permita zeros iniciais e com o problema acima para um grande número de arquivos, e com possíveis problemas se nomes de arquivo contiverem caracteres inválidos e com um ./
prefix em todos os arquivos) seria em algum momento como:
find . \( -name 'ABC1[7-9]*' -o -name 'ABC2[0-3]*' \) \
! -name 'ABC??[0-9]*' -mtime 15 -type f \
-exec ls -lrtd {} +
Tags shell shell-script