Вопрос Сценарий, показывающий тип файла?


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

например :

./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
2018-01-09 09:24


происхождения




ответы:


Вы можете просто использовать 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 ]


2
2018-01-09 09:30



Есть ли какой-либо способ получить его без использования командного файла? - user233233
Вы только хотите показать это 4 балла? (файл, каталог, исполняемый файл, ссылка) - c0rp
да, без использования командного файла - user233233
Я обновляю ответ. Но что означает, говоря «без использования командной строки»? - c0rp
Обратите внимание, что -x не является идеальным тестом для определения того, является ли файл исполняемым. Каталоги также могут иметь исполняемый бит. [ -x /etc/ ] && echo "YES"будет печатать «ДА», хотя технически это не «исполняемый файл». Было бы лучше вложить выражения if, чтобы одна трость проверяла, являются ли обычные файлы также исполняемыми - Sergiy Kolodyazhnyy


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

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

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

$ 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 для правильного отображения значков файлов и открытия их с помощью надлежащих приложений.

Для этой цели существует 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
2017-11-10 18:14