Câu hỏi Tập lệnh hiển thị loại tệp?


Tôi muốn tạo một kịch bản cho thấy loại tệp nào

ví dụ :

./file.sh haha test lala ssss

haha --> file

test --> directory

lala --> symbolic link

ssss --> executable

Im cố gắng làm như thế này nhưng tôi không nhận được kết quả tương tự ...

#!/bin/bash

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

check_symboliclink

Có ai đó có ý tưởng tốt hơn để làm như ví dụ?


1
2018-01-09 09:24


gốc




Các câu trả lời:


Bạn chỉ có thể sử dụng file chỉ huy.

Thí dụ:

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

CẬP NHẬT

Nếu bạn không thể sử dụng file lệnh ở đây là một giải pháp khác.

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

Trong tập lệnh này tôi sử dụng for var in "$@", Ở đâu "$@" có nghĩa tất cả các đối số đã qua. Vì vậy, sử dụng for bạn có thể lặp qua tất cả các đối số đã qua

Bạn có thể thêm một kiểm tra khác nếu bạn muốn, đọc điều này.

ví dụ: nếu bạn muốn thêm séc file is a socket:

chỉ cần thêm tương tự nếu chặn trước done từ:

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

Tôi chỉ thay đổi điều kiện [ -S $var ]


2
2018-01-09 09:30



Có cách nào anthor để có được nó mà không cần sử dụng tập tin lệnh? - user233233
Bạn chỉ muốn hiển thị 4 điểm này? (tệp, thư mục, thực thi, liên kết) - c0rp
có, không sử dụng tệp lệnh - user233233
Tôi cập nhật câu trả lời. Nhưng có nghĩa là gì khi nói 'không sử dụng dòng lệnh'? - c0rp
Xin lưu ý rằng -x không phải là thử nghiệm lý tưởng để xác định xem tệp có thực thi hay không. Thư mục cũng có thể có tập bit thực thi. [ -x /etc/ ] && echo "YES"sẽ in "CÓ", mặc dù về mặt kỹ thuật, nó không phải là "tệp thực thi". Sẽ tốt hơn nếu lồng các câu lệnh if, sao cho một cây gậy kiểm tra xem một tệp thông thường có thực thi hay không - Sergiy Kolodyazhnyy


Hiển thị các kiểu tệp Unix

Cách câu hỏi này được trình bày nó xuất hiện khi người dùng đang cố gắng hiển thị loại tệp trong Tệp kiểu Unix giác quan. Vì mục đích như vậy, người ta không cần một kịch bản, vì đã tồn tại các tiện ích có khả năng hiển thị thông tin đó.

Đặc biệt, stat lệnh rất phù hợp cho mục đích đó. Theo mặc định, stat cho thấy đầu ra dài với nhiều thông tin, nhưng chúng ta có thể sử dụng -c, --format, hoặc là --printf (lưu ý rằng nó giải thích các ký tự thoát dấu chéo) các tùy chọn để đạt được kết quả mong muốn. Ví dụ,

$ 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

Một lệnh khác mà chúng ta có thể sử dụng là find, trong đó có -printf tùy chọn, nhưng khác nhau trong các chỉ số chuyển đổi ( %<letter> biểu tượng) và thực tế là nó xuất ra filetype bằng chữ cái (xem man find đối với thư từ đến thư từ):

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

Tất nhiên, nếu có nhu cầu, chúng tôi luôn có thể tận dụng [ hoặc là test lệnh, nhưng điều đó đòi hỏi nhiều công việc hơn một chút; tuy nhiên theo cách này, chúng ta không phải dựa vào bất cứ điều gì bên ngoài; đó là một cách di động, mặc dù có lẽ không lý tưởng.

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

Và đó là cách nó sẽ hoạt động:

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

Hiển thị nội dung tệp

Nếu chúng tôi muốn nhận thông tin chi tiết về loại tệp theo nội dung có liên quan, có hai cách để tiếp cận mọi thứ. Một, qua loại mime và cái kia - qua con số kỳ diệu, một vài bit đầu tiên của một tệp. Mặc dù mime-type ban đầu tồn tại với mục đích xác định filetype trên internet, hiện nay nhiều ứng dụng máy tính để bàn dựa vào truy vấn thông tin loại mime để hiển thị chính xác các biểu tượng của tệp và mở chúng bằng các ứng dụng thích hợp.

Vì mục đích đó, tồn tại mimetype chỉ huy:

$ 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

Và để thực hiện các thử nghiệm với "số ma thuật", chúng tôi sẽ sử dụng file chỉ huy:

$ 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)

mà cũng có thể làm mimetypeCông việc của:

$ 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