Я хочу сделать сценарий, который показывает, какой тип файла
, например:
./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
У кого-то есть идея получше, как в примере?
Вы можете просто использовать команду 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 ]
То, как представлен этот вопрос, появляется, когда пользователь пытается отобразить тип файла в смысле файлового типа 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