Как представляется этот вопрос, он появляется, когда пользователь пытается отобразить тип файла в смысле файла 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, но отличается спецификаторами преобразования (символы %
$ 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
Если мы хотим для получения подробной информации о типе файла в отношении содержания, есть два способа приблизиться к вещам. Один, через Unix filetype , а другой - через магическое число, первые несколько бит файла. В то время как 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)
, которая также может do 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
У меня была аналогичная проблема в моей среде RubyMine. У меня было две проблемы: я не мог редактировать файлы (только для чтения), а среда IDE не могла сохранить файлы проекта.
Моя папка проекта каким-то образом изменила ее право собственности на root (она работала задолго до этого) и не я (мое имя пользователя). Поэтому я изменил права собственности на проект (мое имя пользователя), используя sudo chown -R username:username ~/path/to/project/foldername/*, и удалил только статус чтения только для файлов, но он не смог сохранить проект, хотя изменения могут отразиться при перезагрузке браузера.
Не было, пока я также не заметил, что файлы .idea (внутри моей папки проекта), созданные RubyMine IDE, все еще имеют владельца как root. Затем я изменил свое владение, как sudo chown -R username:username ~/path/to/project/projectname/.idea/*, теперь я могу также сохранить файлы проекта.
NB: Мне нужно было указать файлы .idea, а не только всю папку проекта, как раньше.
Вы должны войти в систему под учетной записью root. Но сначала вы должны установить пароль unix для root. Затем вы можете войти в систему, набрав «su» в terninal. Или вы можете получить права root, набрав «sudo su». Если вы хотите сначала войти в систему с правами администратора на графическом рабочем столе, вы должны включить эту возможность для пользователя root.