我想写一个脚本来显示文件类型
例如 :
./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
您只需使用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
:
只需在单词前添加相同的 if 块done
:
if [ -S $var ]; then
echo $var " - > is a Socket"
fi
我只改变条件[ -S $var ]
答案2
显示 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-type 最初是为了在互联网上确定文件类型而存在的,但现在许多桌面应用程序都依赖于查询 mime-type 信息来正确显示文件图标并使用适当的应用程序打开它们。
为了此目的,存在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