Script mostrando o tipo de arquivo?

1

Eu quero fazer um script que mostre que tipo de arquivo é

por exemplo:

./file.sh haha test lala ssss

haha --> file

test --> directory

lala --> symbolic link

ssss --> executable

Estou tentando fazer assim, mas não consigo o mesmo resultado ...

#!/bin/bash

function check_symboliclink
{
echo "Write symbolic link"
read something
find $something -type l 
echo "$something  symbolic link";
}

check_symboliclink

Existe alguém que tenha uma ideia melhor para fazer como o exemplo?

    
por user233233 09.01.2014 / 10:24

2 respostas

2

Você pode usar apenas o comando file .

Exemplo:

c0rp@c0rp: file file_1 file_2 file_3
file_1 ASCII text
file_2 ASCII text
file_3: symbolic link to file_2

UPDATE

Se você não pode usar o comando file , aqui está outra solução.

#!/bin/bash
for var in "$@"
do
    if [ -d $var ]; then
        echo $var " - > is a directory"
    fi

    if [ -f $var ]; then
        echo $var " - > is a file"
    fi

    if [ -h $var ]; then
        echo $var " - > is a symbolic link"
    fi

    if [ -x $var ]; then
        echo $var " - > executable"
    fi
done

Neste script eu uso for var in "$@" , onde "$@" significa todos os argumentos passados . Então, usando for você pode percorrer todos os argumentos passados

Você pode adicionar outra verificação, se quiser, leia esta .

por exemplo, se você quiser adicionar check file is a socket :

adicione o mesmo se bloquear antes de done word:

            if [ -S $var ]; then
                    echo $var " - > is a Socket"
            fi

Eu mudo apenas a condição [ -S $var ]

    
por c0rp 09.01.2014 / 10:30
0

Mostrando tipos de arquivos Unix

A forma como essa pergunta é apresentada aparece quando o usuário está tentando exibir o tipo de arquivo no tipo de arquivo Unix . Para tal, não é necessário um script, pois já existem utilitários capazes de exibir tais informações.

Em particular, o comando stat é bem adequado para esse propósito. Por padrão, stat mostra uma saída longa com muitas informações, mas podemos usar as opções -c , --format ou --printf (observe que ela interpreta símbolos de escape de barra invertida) para obter a saída desejada. Por exemplo,

$ stat -c '%n: %F' /etc/passwd /etc/resolv.conf /etc                        
/etc/passwd: regular file
/etc/resolv.conf: symbolic link
/etc: directory


$ stat --printf '%n: %F\n' /etc/passwd /etc/resolv.conf /etc                
/etc/passwd: regular file
/etc/resolv.conf: symbolic link
/etc: directory

Outro comando que podemos usar é find , que tem -printf opção, mas difere em especificadores de conversão (os símbolos %<letter> ) e o fato de gerar o tipo de arquivo em letras (veja o man find para tipo de arquivo para correspondência carta):

$ find /etc/passwd /etc/resolv.conf /etc -prune  -printf "%p:%y\n"          
/etc/passwd:f
/etc/resolv.conf:l
/etc:d

É claro que, se houver necessidade, sempre poderemos usar o comando [ ou test , mas isso exigirá um pouco mais de trabalho; no entanto, dessa forma, não precisamos confiar em nada externo; é um modo portátil, embora provavelmente não seja o ideal.

#!/bin/sh

check_filetype(){
    if [ -f "" ];then
        if [ -h "" ]; then
            printf "%s\n" ": symbolic link"
        else
            printf "%s\n" ": regular"
        fi
    elif [ -d ""  ]; then
        printf "%s\n" ": directory"
    elif [ -c "" ]; then
        printf "%s\n" ": character device"
    elif [ -p "" ]; then
        printf "%s\n" ": named pipe"
    elif [ -S "" ]; then
        printf "%s\n" ": socket"
    fi
}

for arg
do
    check_filetype "$arg"
done

E é assim que funcionaria:

$ ./checkft.sh /etc/passwd /etc/resolv.conf /etc test.fifo /dev/tty1              
/etc/passwd: regular
/etc/resolv.conf: symbolic link
/etc: directory
test.fifo: named pipe
/dev/tty1: character device

Mostrando o conteúdo do arquivo

Se quisermos obter informações detalhadas sobre o tipo de arquivo no que diz respeito ao conteúdo, há duas maneiras de abordar as coisas. Um, via tipo mime e o outro - via magic number , os primeiros bits de um arquivo. Embora o tipo mime seja originalmente usado para determinar o tipo de arquivo na Internet, atualmente muitos aplicativos de desktop dependem da consulta de informações do tipo mime para exibir corretamente ícones de arquivos e abri-los com aplicativos apropriados.

Para esse propósito, existe o comando mimetype :

$ mimetype /etc/ /etc/resolv.conf  /etc/passwd test.fifo                          
/etc/:            inode/directory
/etc/resolv.conf: inode/symlink
/etc/passwd:      text/plain
test.fifo:        inode/fifo

E para realizar testes com "números mágicos", usamos o comando file :

$ file /etc/ /etc/resolv.conf  /etc/passwd test.fifo                              
/etc/:            directory
/etc/resolv.conf: symbolic link to ../run/resolvconf/resolv.conf
/etc/passwd:      ASCII text
test.fifo:        fifo (named pipe)

que também pode fazer o trabalho de mimetype :

$ file --mime-type /etc/ /etc/resolv.conf  /etc/passwd test.fifo                  
/etc/:            inode/directory
/etc/resolv.conf: inode/symlink
/etc/passwd:      text/plain
test.fifo:        inode/fifo
    
por Sergiy Kolodyazhnyy 10.11.2017 / 19:14