วิธีแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีที่มีพา ธ สัมบูรณ์


30

ฉันต้องการไฟล์ (โดยเฉพาะอย่างยิ่งไฟล์. list) ซึ่งมีเส้นทางที่แน่นอนของทุกไฟล์ในไดเรกทอรี

ตัวอย่าง dir1: file1.txt file2.txt file3.txt

listOfFiles.list:

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

ฉันจะทำสิ่งนี้ให้สำเร็จใน linux / mac ได้อย่างไร?

คำตอบ:


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

จะทำงานใน linux หมวกสีแดงนี้หรือไม่
arabian_albert

4
คำสั่งนั้นใช้ได้กับระบบปฏิบัติการ Linux หรือ UNIX หากคุณต้องการรับไฟล์หนึ่งไฟล์ต่อหนึ่งบรรทัดคุณต้องใช้ls -d -1 $PWD/*
MelBurslan

1
หากชื่อไฟล์ของคุณยาวหรือความกว้างของเทอร์มินัลแคบใช่ว่าเป็นกรณีนี้ แต่บอกว่าคุณขยายหน้าต่างเทอร์มินัลให้ใหญ่ที่สุดเพื่อครอบครองทั้งหน้าจอหรือชื่อไฟล์ของคุณ (รวมถึงพา ธ ) สั้นมาก จริง -1ตัวเลือกรับประกันว่าคุณจะได้รับชื่อไฟล์หนึ่งรายการต่อบรรทัด
MelBurslan

7
การเพิ่ม @MelBurslan จำเป็นเฉพาะเมื่อเอาต์พุตเป็นเทอร์มินัล lsตรวจสอบว่าการส่งออกเป็นไฟล์หรือขั้ว
Runium

9
สิ่งนี้จะล้มเหลวหากมีไฟล์หลายพันไฟล์ในไดเรกทอรีนั่นคือเพียงพอที่จะเกินขนาดบรรทัดคำสั่งสูงสุด (ทำให้มีความเป็นไปได้มากขึ้นเนื่องจากเชลล์กำลังขยายชื่อไฟล์ด้วยพา ธ เต็ม) @ findคำตอบของ Andy Dalton เป็นทางออกที่ดีกว่าเพราะจะไม่ล้มเหลวไม่ว่าจะมีไฟล์กี่ไฟล์ก็ตาม
cas

33

คุณสามารถใช้ค้นหา สมมติว่าคุณต้องการไฟล์ปกติเท่านั้นคุณสามารถทำได้:

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

คุณสามารถปรับพารามิเตอร์ประเภทตามความเหมาะสมหากคุณต้องการไฟล์ประเภทอื่น


7
+1 lsสำหรับชี้การแก้ปัญหาในอนาคตมากขึ้นว่า สิ่งนี้findจะชดเชยไดเรกทอรีย่อยสำหรับการไม่เรียกซ้ำคุณต้องเพิ่ม-maxdepth 1ก่อนการ-typeโต้แย้ง
kubanczyk

@AndyDalton วิธีการได้รับเดียวกันกับอาร์เรย์ในทุบตี
Kasun Siyambalapitiya

13

โปรดทราบว่าใน:

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

มันเป็นเปลือกที่คำนวณรายการ (ไม่ใช่ซ่อน) lsไฟล์ในไดเรกทอรีและผ่านรายการเพื่อ lsเพียงพิมพ์รายการที่นี่ดังนั้นคุณสามารถทำได้เช่นกัน:

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

3
การใช้printfมีโบนัสเพิ่มเติมที่คุณจะไม่ได้รับข้อผิดพลาด 'บรรทัดคำสั่งยาวเกินไป' หากคุณมีไฟล์หลายพันไฟล์เนื่องจากprintfไม่ได้ทำงานเป็นกระบวนการแยกต่างหาก
Adrian Pronk

2
@AdrianPronk ใช่แล้วยกเว้นเชลล์ที่printfไม่มี built-in like pdkshและบางส่วนของอนุพันธ์หรือ Bourne shell เวอร์ชันส่วนใหญ่ ข้อเสียเปรียบข้อหนึ่งที่เปรียบเทียบกับls -dคือถ้าไม่มีไฟล์ที่ไม่ซ่อนอยู่ในนั้นไฟล์จะพิมพ์ออกมา/path/to/*ในขณะที่lsจะให้ข้อผิดพลาดเกี่ยวกับไฟล์นั้นที่ไม่มีอยู่แทน
Stéphane Chazelas


3

คุณสามารถใช้realpathหรือreadlink:

ls | xargs realpath
  • xargs สร้างและดำเนินการบรรทัดคำสั่งจากอินพุตมาตรฐาน
  • realpath: คืนชื่อพา ธ สัมบูรณ์ที่ได้รับการยอมรับ
  • readlink: อ่านค่าของลิงก์สัญลักษณ์

realpath: ไม่พบคำสั่ง
rogerdpack

@rogerdpack คุณติดตั้งแพ็คเกจcoreutilsหรือไม่? dpkg -S /usr/bin/realpathฉันจะได้รับข้อมูลดังกล่าวกับ ตรวจสอบนี้
Pablo

3

อีกวิธีที่treeไม่ได้กล่าวถึงที่นี่มันจะวนซ้ำและไม่เหมือนกับ find หรือ ls ที่คุณไม่มีข้อผิดพลาด (เช่น: Permission denied, Not a directory) คุณยังได้รับพา ธ สัมบูรณ์ในกรณีที่คุณต้องการให้ฟีดไฟล์ไปยังxargsหรือคำสั่งอื่น ๆ

tree -fai /pathYouWantToList >listOfFiles.list

ความหมายตัวเลือก:

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

วิธีติดตั้งtree:

sudo apt install tree บน Ubuntu / Debian

sudo yum install tree บน CentOS / Fedora

sudo zypper install tree บน OpenSUSE


1
ต้นไม้: ไม่พบคำสั่ง
rogerdpack

@rogerdpack sudo apt install treeบน Ubuntu sudo yum install treeบน CentOS sudo zypper install treeบน OpenSUSE
Eduard Florinescu

1
brew install treeบน Mac
oOEric

2

ในสภาพแวดล้อม Linux ที่ผ่านมาฉันมี resolveคำสั่งที่จะสร้างมาตรฐานเส้นทางรวมถึงการสร้างเส้นทางสัมพัทธ์เป็นเส้นทางที่แน่นอน ฉันหามันไม่พบในตอนนี้ดังนั้นอาจมีบางคนเขียนขึ้นในองค์กรนั้น

คุณสามารถสร้างสคริปต์ของคุณเองโดยใช้ฟังก์ชั่นในไลบรารีมาตรฐาน Python หรือ Perl (และภาษาอื่น ๆ ด้วย)

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";
}

จากนั้นคุณจะแก้ปัญหาด้วย:

resolve.py * > listOfFiles.list

ด้วยคำสั่งนี้คุณสามารถทำสิ่งนี้:

cd /root/dir1/dir2/dir3
resolve.py ../../dir4/foo.txt
# prints /root/dir1/dir4/foo.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.