Cách liệt kê tất cả các tệp trong một thư mục có đường dẫn tuyệt đối


30

Tôi cần một tệp (tốt nhất là tệp .list) chứa đường dẫn tuyệt đối của mọi tệp trong một thư mục.

Ví dụ dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

/Users/haddad/dir1/file1.txt
/Users/haddad/dir1/file2.txt
/Users/haddad/dir1/file3.txt

Làm thế nào tôi có thể thực hiện điều này trong linux / mac?

Câu trả lời:


30
ls -d "$PWD"/* > listOfFiles.list

điều này sẽ làm việc trong linux mũ đỏ?
arabian_albert

4
Lệnh đó hoạt động trong mọi hệ điều hành Linux hoặc UNIX. Nếu bạn muốn nhận một tệp trên mỗi dòng, bạn cần sử dụngls -d -1 $PWD/*
MelBurslan

1
nếu tên tệp của bạn dài hoặc chiều rộng của thiết bị hẹp, vâng, đó sẽ là trường hợp, nhưng giả sử bạn đã tối đa hóa cửa sổ đầu cuối để chiếm toàn bộ màn hình hoặc tên tệp của bạn (bao gồm cả đường dẫn) thực sự ngắn, sẽ không giữ được thật. -1tùy chọn đảm bảo bạn nhận được một tên tệp trên mỗi dòng
MelBurslan

7
Bổ sung của @MelBurslan chỉ cần thiết nếu đầu ra là một đầu cuối. lsphát hiện nếu đầu ra là một tập tin hoặc thiết bị đầu cuối.
Runium

9
điều này sẽ thất bại nếu có hàng ngàn tệp trong thư mục, tức là đủ để vượt quá kích thước dòng lệnh tối đa (nhiều khả năng là do trình bao đang mở rộng tên tệp với đường dẫn đầy đủ). findCâu trả lời của @Andy Dalton là một giải pháp tốt hơn, vì nó sẽ không thất bại cho dù có bao nhiêu tệp được liệt kê.
cas

33

Bạn có thể sử dụng tìm. Giả sử rằng bạn chỉ muốn các tệp thông thường, bạn có thể làm:

find /path/to/dir -type f > listOfFiles.list

Bạn có thể điều chỉnh tham số loại cho phù hợp nếu bạn muốn các loại tệp khác.


7
+1 để chỉ ra một giải pháp chứng minh tương lai hơn đó ls. Điều này findkhông lặp lại các thư mục con, đối với không đệ quy bạn cần thêm -maxdepth 1trước khi -typeđối số.
kubanchot

@AndyDalton Làm thế nào để có được cùng một mảng trong bash
Kasun Siyambalapitiya

13

Lưu ý rằng trong:

ls -d "$PWD"/* > listOfFiles.list

Đó là shell tính toán danh sách các tệp (không bị ẩn) trong thư mục và chuyển danh sách tới ls. lschỉ in danh sách đó ở đây, vì vậy bạn cũng có thể làm:

printf '%s\n' "$PWD"/*

3
Việc sử dụng printfcó thêm phần thưởng mà bạn sẽ không gặp phải lỗi 'dòng lệnh quá dài' nếu bạn có hàng ngàn tệp printfkhông được chạy dưới dạng một quy trình riêng biệt.
Adrian Pronk

2
@AdrianPronk, vâng, ngoại trừ trong các vỏ printfkhông được tích hợp sẵn pdkshvà một số dẫn xuất của nó hoặc hầu hết các phiên bản của vỏ Bourne. Một nhược điểm so với ls -dlà nếu không có tệp không bị ẩn trong đó, nó sẽ in /path/to/*trong khi lssẽ báo lỗi cho bạn về tệp đó không tồn tại.
Stéphane Chazelas 10/03/2016

10

Để chỉ xem các tệp thông thường -

find "$PWD" -type f  > output

3

Bạn chỉ có thể sử dụng realpathhoặc readlink:

ls | xargs realpath
  • xargs xây dựng và thực hiện các dòng lệnh từ đầu vào tiêu chuẩn.
  • realpath: trả về tên đường dẫn tuyệt đối được chuẩn hóa
  • readlink: đọc giá trị của một liên kết tượng trưng

realpath: lệnh không được tìm thấy
rogerdpack 23/03/18

@rogerdpack bạn đã cài đặt gói coreutils chưa? Tôi nhận được thông tin đó với dpkg -S /usr/bin/realpath. Kiểm tra này .
Pablo A

3

Một cách khác với tree, không được đề cập ở đây, nó đi theo cách đệ quy và không giống như tìm hoặc bạn không có bất kỳ lỗi nào (như : Permission denied, Not a directory) , bạn cũng có được đường dẫn tuyệt đối trong trường hợp bạn muốn đưa các tệp đến xargshoặc lệnh khác

tree -fai /pathYouWantToList >listOfFiles.list

Các tùy chọn có nghĩa:

-a     All  files  are  printed.  By default tree does not print hidden files (those beginning with a dot
       `.').  In no event does tree print the file system constructs `.'  (current  directory)  and  `..'
       (previous directory).

-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

-f     Prints the full path prefix for each file.

Để cài đặt tree:

sudo apt install tree trên Ubuntu / Debian

sudo yum install tree trên CentOS / Fedora

sudo zypper install tree trên OpenSUSE


1
cây: lệnh không tìm thấy
rogerdpack 23/03/18

@rogerdpack sudo apt install treetrên Ubuntu sudo yum install treetrên CentOS sudo zypper install treetrên OpenSUSE
Eduard Florinescu

1
brew install treetrên Mac
oOEric

2

Trong môi trường Linux trước đây, tôi đã có một resolve lệnh sẽ chuẩn hóa các đường dẫn, bao gồm tạo một đường dẫn tương đối thành một đường dẫn tuyệt đối. Tôi không thể tìm thấy nó bây giờ, vì vậy có lẽ nó được viết bởi một người nào đó trong tổ chức đó.

Bạn có thể tạo tập lệnh của riêng mình bằng các hàm trong thư viện chuẩn Python hoặc Perl (và có thể cả các ngôn ngữ khác nữa).

resolve.py :

#!/bin/env python

import sys
import os.path

for path in sys.argv:
    print os.path.abspath(path)

resolve.pl :

#!/bin/env perl

use warnings;
use Cwd qw ( abs_path );

foreach (@ARGV) {
    print abs_path($_), "\n";
}

Sau đó, bạn sẽ giải quyết vấn đề của mình với:

resolve.py * > listOfFiles.list

Với lệnh này, bạn cũng có thể làm những việc như thế này:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
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.