Thay thế thư mục ./ và ../ bằng tên thực


5

Tôi có một tập lệnh tìm tập tin trong thư mục được chỉ định bởi người dùng.

#!/bin/bash

# make sure about the correct input
if [ -z $1 ]
then
    echo "Usage: ./script_name.sh    path/to/directory"
else
    DIR=$1
    if [ $DIR = '.' ]
    then 
        echo "Find files in the directory $PWD"
    else  
        echo "Find files in the directory $DIR"
    fi

    find $DIR -type f -exec basename {} \; 
fi

nếu tôi nhập

$ ./script_name.sh .

kịch bản cho tôi thay thế chính xác ./ thành $ PWD và hiển thị (ví dụ)

$ Find files in the directory /root/scripts  

Nhưng tôi không thể đưa ra quyết định làm thế nào để thay thế ../ thành tên của thư mục ngay trên hệ thống phân cấp. Nếu tôi nhập

$ ./script_name.sh ..  

kịch bản cho tôi đầu ra

$ Find files in the directory ..  

Có ai biết cách thay thế ../ thành tên thật của thư mục không?


Hãy thử realpathlệnh nếu nó có sẵn.
Bodo

@Bodo realpath hoạt động tốt trong trường hợp này.
Alex Kuchin

Câu trả lời:


11

GNU coreutils có realpathlệnh thực hiện điều đó.

/tmp/a$ realpath ..
/tmp

Mặc dù lưu ý rằng nếu đường dẫn chứa liên kết tượng trưng, ​​nó cũng sẽ giải quyết những điều đó:

/tmp/b/c$ realpath ..
/tmp/x/y

(Ở đây, /tmp/blà một liên kết tượng trưng đến /tmp/x/y/)

Điều này có thể khác với những gì vỏ làm với cd ... Ví dụ cd ../..từ /tmp/b/ctrong Bash hiển thị đường dẫn mới như /tmp/, không phải là /tmp/x.


readlinksẽ là một lựa chọn khác.
twalberg

@twalberg readlinkchỉ giải quyết các liên kết tượng trưng và không nhập các mục như .hoặc .., đó là điểm của câu hỏi. readlink .dẫn đến một lỗi (trả về mã trạng thái 1).
JoL

4
@JoL Hãy thửreadlink -f .
twalberg


1

Trước tiên, bạn có thể cdđến ..và sau đó sử dụng $PWD.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.