Liste o arquivo com as séries 12 * e 13 * de uma só vez

1

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
    
por faruque Azam 08.09.2016 / 10:18

2 respostas

0

A opção

-name procura o padrão. Colchetes significa OR para o que está dentro.

find . -type f -name  'ABC1[23]*'
    
por 08.09.2016 / 10:37
0

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 {} +
    
por 08.09.2016 / 10:36