como filtrar ou extrair o arquivo do diretório?

0

Eu tenho arquivos em formato abaixo:

abc_abc_abc   
abc_abc_abc.1    
abc_bca_bca    
abc_bca_bca.1    
abc_bca_bca.2    
abc_cab    
abc

Eu quero pegar os arquivos que estão tendo 2 underscores e excluir outros arquivos como com. (ponto) e sublinhado único.

O resultado seria parecido com:

abc_abc_abc
abc_bca_bca
    
por Kannan M 26.07.2018 / 10:18

3 respostas

4

Você pode usar find :

find . -name "*_*_*" -not -name "*.*"

Isso irá procurar em subdiretórios também. Se você não quiser isso, adicione -maxdepth 1 e talvez -type f se quiser apenas arquivos regulares:

find . -maxdepth 1 -type f -name "*_*_*" -not -name "*.*"

Adicione -printf "%P\n" para se livrar do ./ precedente.

    
por 26.07.2018 / 10:31
0

Com ksh , bash -O extglob ou zsh -o kshglob usando algumas negações duplas (supondo que você também queira excluir arquivos com 3 ou mais sublinhados):

printf '%s\n' !(!(*_*_*)|*_*_*_*|*.*)

Com o operador zsh -o extendedglob e seu ~ exceto :

printf '%s\n' *_*_*~(*_*_*_*|*.*)

ou usando o operador de negação nativa de zsh :

printf '%s\n' ^(^*_*_*|*_*_*_*|*.*)

Se você ainda deseja os arquivos com mais de dois underscores, isso é apenas !(!(*_*_*)|*.*) ou *_*_*~*.* ou ^(^*_*_*|*.*) no lugar do acima, respectivamente.

Outras abordagens podem ser !(*[._]*)_!(*[._]*)_!(*[._]*) (substitua [_.] por . para permitir três ou mais sublinhados).

    
por 26.07.2018 / 14:30
0

Simplisticamente, no bash (ou shells que suportam arrays:

files=(???_???_???)

Isso usa o caractere ? globbing para pegar arquivos nomeados como você mostrou, com 3 caracteres, um sublinhado, 3 caracteres, um sublinhado e, em seguida, três caracteres. Isso pode ser frustrado se você tiver um nome de arquivo como xyz_qrs_t.1 .

Um pouco mais refinado seria:

files=([^._][^._][^._]_[^._][^._][^._]_[^._][^._][^._])

... que usa a sintaxe de globbing a>. Cada [^ ... ] pede por um caractere que não seja um período ou sublinhado. Misturado há dois sublinhados, separando três lotes de três [^._] .

Faça um loop sobre eles com:

for f in "${files[@]}"; do printf "File: %s\n" "$f"; done
    
por 26.07.2018 / 14:43