Скрипт, показывающий тип файла?

Я хочу сделать сценарий, который показывает, какой тип файла

, например:

./file.sh haha test lala ssss

haha --> file

test --> directory

lala --> symbolic link

ssss --> executable

Я пытаюсь сделать так, но я не получаю тот же результат ...

#!/bin/bash

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

check_symboliclink

У кого-то есть идея получше, как в примере?

1
задан 10 November 2017 в 21:15

2 ответа

Вы можете просто использовать команду file.

Пример:

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

ОБНОВЛЕНИЕ

Если вы не можете использовать команду file, вот другое решение.

#!/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

В этом скрипте я использую for var in "$@", где "$@" означает все переданные аргументы . Таким образом, используя for вы можете перебрать все переданные аргументы

Вы можете добавить еще одну проверку, если хотите, прочитайте это .

Например, если вы хотите добавить, отметьте file is a socket:

, просто добавьте то же самое, если блок перед done словом:

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

Я изменяю только условие [ -S $var ]

0
ответ дан 10 November 2017 в 21:15

Отображение файловых типов Unix

То, как представлен этот вопрос, появляется, когда пользователь пытается отобразить тип файла в смысле файлового типа Unix . Для этой цели не нужен сценарий, поскольку уже существуют утилиты, способные отображать такую ​​информацию.

В частности, команда stat хорошо подходит для этой цели. По умолчанию stat показывает длинный вывод с большим количеством информации, но мы можем использовать опции -c, --format или --printf (обратите внимание, что он интерпретирует escape-символы обратной косой черты) для достижения желаемого результата. Например,

$ 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

Другой командой, которую мы можем использовать, является find, которая имеет опцию -printf, но отличается спецификаторами преобразования (символами %<letter>) и тем, что выводит тип файла в буквы (см. man find для соответствия типов файлов и букв):

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

Конечно, если есть необходимость, мы всегда можем использовать команду [ или test, но это ' потребует немного больше работы; однако таким образом мы не должны полагаться на что-то внешнее; это переносной способ, хотя, вероятно, не идеальный.

#!/bin/sh

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

for arg
do
    check_filetype "$arg"
done

И вот как это будет работать:

$ ./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

Отображение содержимого файла

Если мы хотим получить подробную информацию о типе файла в том, что касается содержимого, есть два способа приблизиться к вещам. Один через MIME-тип , а другой - через магическое число , первые несколько бит файла. Хотя MIME-тип изначально существовал для определения типа файлов в Интернете, в настоящее время многие настольные приложения полагаются на запрос информации MIME-типа для правильного отображения значков файлов и открытия их с помощью соответствующих приложений.

Для этого существует команда 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

А для выполнения тестов с «магическими числами» мы будем использовать команду 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)

который также может выполнять работу 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
0
ответ дан 10 November 2017 в 21:15

Другие вопросы по тегам:

Похожие вопросы: