Как вывести список всех файлов в каталоге с абсолютными путями

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?

arabian_albert
источник

Ответы:

30
ls -d "$PWD"/* > listOfFiles.list
Comforse
источник
это будет работать в Red Hat Linux?
arabian_albert
4
Эта команда работает в любой операционной системе Linux или UNIX. Если вы хотите получить один файл на строку, вы должны использоватьls -d -1 $PWD/*
MelBurslan
1
если ваши имена файлов длинные или ширина терминала узкая, да, это будет так, но, скажем, вы развернули окно терминала на весь экран, или ваши имена файлов (включая путь) действительно короткие, что не будет удерживаться правда. -1опция гарантирует, что вы получите одно имя файла на строку
MelBurslan
7
Добавление @MelBurslan необходимо только в том случае, если вывод соответствует терминалу. lsобнаруживает, выводится ли файл или терминал.
Runium
9
это потерпит неудачу, если в каталоге будет много тысяч файлов, то есть достаточно, чтобы превысить максимальный размер командной строки (что более вероятно из-за того, что оболочка расширяет имена файлов с полным путем). @ findОтвет Энди Далтона - лучшее решение, так как оно не подведет, сколько бы файлов ни было в списке.
Cas
33

Вы можете использовать найти. Предполагая, что вы хотите только обычные файлы, вы можете сделать:

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

Вы можете настроить параметр типа соответствующим образом, если вам нужны другие типы файлов.

Энди Далтон
источник
7
+1 за указание более перспективного решения, которое ls. Это findделает рекурсивные подкаталоги, для нерекурсивных вы должны добавить -maxdepth 1перед -typeаргументом.
kubanczyk
@AndyDalton Как получить то же самое для массива в bash
Касун Сиямбалапития
13

Обратите внимание, что в:

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

Это оболочка, которая вычисляет список (не скрытых) файлов в каталоге и передает список ls. lsпросто распечатывает этот список здесь, чтобы вы могли также сделать:

printf '%s\n' "$PWD"/*
Стефан Шазелас
источник
3
Использование printfимеет дополнительный бонус, что вы не получите ошибку «слишком длинная командная строка», если у вас есть тысячи файлов, поскольку они printfне запускаются как отдельный процесс.
Адриан Пронк
2
@AdrianPronk, да, за исключением оболочек, в которых printfнет встроенных pdkshфункций, и некоторых из его производных или большинства версий оболочки Bourne. Один недостаток по сравнению с тем ls -d, что если там нет не скрытого файла, он напечатает, в /path/to/*то время как lsвы получите ошибку о том, что этот файл не существует.
Стефан Шазелас
10

Чтобы увидеть только обычные файлы -

find "$PWD" -type f  > output
jai_s
источник
3

Вы можете просто использовать realpathили readlink:

ls | xargs realpath
  • xargs строить и выполнять командные строки из стандартного ввода.
  • realpath: вернуть канонизированный абсолютный путь
  • readlink: прочитать значение символической ссылки
Пабло А
источник
realpath: команда не найдена
rogerdpack
@rogerdpack у вас установлен пакет coreutils ? Я получаю эту информацию с dpkg -S /usr/bin/realpath. Проверьте это .
Пабло А
3

Другой способ с treeне упомянутым здесь, он идет рекурсивно и в отличие от find, или если у вас нет ошибок (например,:) 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
jskroch
источник