Як перелічити всі файли в каталозі з абсолютними шляхами


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визначає, чи є вихід у файл або термінал.
Руніум

9
це не вдасться, якщо в каталозі є багато тисяч файлів, тобто достатньо, щоб перевищити максимальний розмір командного рядка (що зробило більше ймовірним тим, що оболонка розширює назви файлів повним шляхом). @Andy Dalton findвідповідь є кращим рішенням, оскільки вона не вийде з ладу, незалежно від того, скільки файлів потрібно перелічити.
cas

33

Ви можете використовувати find. Припускаючи, що вам потрібні лише звичайні файли, ви можете:

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

Ви можете налаштувати параметр типу, якщо потрібно, для інших типів файлів.


7
+1 для вказівки на більш надійне рішення, яке ls. Це findробить рекурсию підкаталогів, для нерекурсівние вам потрібно додати -maxdepth 1до того -typeаргументу.
kubanczyk

@AndyDalton Як отримати те ж саме до масиву в bash
Kasun Siyambalapitiya

13

Зауважте, що в:

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

Це оболонка, яка обчислює список (не прихованих) файлів у каталозі та передає цей список ls. lsпросто надрукує цей список тут, щоб ви могли також зробити:

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

3
Використання printfмає додатковий бонус, що ви не отримаєте помилку "занадто довгий командний рядок", якщо у вас є тисячі файлів, оскільки printfвони не запускаються як окремий процес.
Адріан Пронк

2
@AdrianPronk, так, за винятком оболонок, де printfнемає вбудованого типу, pdkshа також деяких його похідних або більшості версій оболонки Борна. Один недолік порівняно з ls -dтим, що якщо в ньому немає жодного прихованого файлу, він буде надрукований, /path/to/*тоді як lsви отримаєте помилку про те, що файл не існує.
Стефан Шазелас

10

Щоб побачити лише звичайні файли -

find "$PWD" -type f  > output

3

Ви можете просто використовувати realpathабо readlink:

ls | xargs realpath
  • xargs будувати та виконувати командні рядки зі стандартного вводу.
  • realpath: повернути канонізовану абсолютну назву шляху
  • readlink: значення зчитування символічного посилання

realpath: команду не знайдено
rogerdpack

@rogerdpack у вас встановлений пакет coreutils ? Я отримую цю інформацію з dpkg -S /usr/bin/realpath. Перевірте це .
Пабло А

3

Іншим спосіб з tree, що не згаданим тут, це йде рекурсивно і в відміну від знахідки або 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
Едуард Флорінеску

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.