Eu quero extrair um array especialmente formatado da lista do diretório atual.
$ ls
Output:
fileABC.ext1
filePQR.ext2
dirMNO
dirFGH
Eu quero apenas o diretório e arquivos de extensão específica
quero um array assim
(1 dirFGH "is a dir" 2 dirMNO "is a dir" 3 fileABC.ext1 "is an ext1 file")
estou fazendo o mesmo com
num=0
while read -r line
do
if [ -d $line ]
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is a dir")
elif #check for extension used
then
num=$(( $num + 1 ))
array+=(num)
array+=($line)
array+=("Is an ext1 file")
fi
done < <(ls -1 --group-directories-first "$path")
mas este método é mais lento. Por favor, sugira-me um mesmo método funcional, mas otimizado.
Não há necessidade de analisar
ls
. Lembre-se de colocar aspas duplas sempre que usar suas variáveis, como"$line"
, caso contrário, estará sujeito a divisão$IFS
(normalmente espaço em branco) e globbing. (Por exemplo, se$line
fosse ,hello world
vocêarray+=($line)
adicionaria dois valoreshello
eworld
.)Saída
A expressão
$((${#array[@]} /3 +1))
calcula o número de entrada com base no número de valores triplos já existentes no array e significa que não precisamos carregar$num
.Possíveis melhorias
Se você estiver procurando por arquivos de um determinado tipo, pode verificá-los com
file
. Por exemplo,file x.ods
no meu PC retornax.ods: OpenDocument Spreadsheet
.Você pode achar mais fácil usar duas matrizes diferentes, uma para os nomes dos arquivos e outra para a mensagem do tipo de arquivo personalizado:
Aqui, o valor do índice (
$num
) pode ser derivado diretamente pelo índice do item e você não precisa armazená-lo em sua própria matriz.Com
zsh
em vez debash
:Observe que in
zsh
, como em csh/tcsh,$path
é a matriz especial vinculada a$PATH
(a variável de ambiente padrão que especifica a lista de diretórios onde procurar comandos) e não deve ser usada como uma variável normal, portanto,$dir
usada acima.