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

Мне нужен файл (желательно файл .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?


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

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

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

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


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

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

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


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

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

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

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

Обратите внимание, что он не включает скрытые файлы, включает файлы любого типа (включая каталоги) и, если в каталоге нет не скрытого файла, в POSIX/csh/rc shells, вы получите в качестве вывода /current/wd/* . Кроме того, поскольку символ новой строки действителен, как и любой в пути к файлу, если вы разделите пути к файлам символами новой строки, вы не сможете использовать полученный файл для надежного возврата к списку файлов.

С оболочкой zsh вместо этого вы можете сделать:

  print -rNC1 $ PWD/* (ND-.  )> listOfFiles.list  

Где:

  • -rC1 печатает r aw в 1 C столбец.
  • -N , выходные записи разделены NUL вместо разделителей новой строки (строки), поскольку NUL — единственный символ, который не может быть найден в имени файла.
  • N : заменяется на ничто, если нет подходящего файла ( nullglob ).
  • D : включать скрытые файлы ( dotglob ).
  • -. : включать только обычные файлы (. ) после разрешения символической ссылки ( - ).

Тогда вы сможете сделать что-то вроде:

  xargs -0 rm -f -  

Чтобы удалить эти файлы, например.

Вы также можете использовать модификатор : P в квалификаторах glob, чтобы получить эквивалент realpath () для файлов. расширяется из глобусов (получает полный путь, исключая любой компонент символической ссылки):

  print -rNC1 - * (ND - .: P)> listOfFiles.list  


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

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

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

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

Обратите внимание, что он не включает скрытые файлы, включает файлы любого типа (включая каталоги) и, если в каталоге нет не скрытого файла, в POSIX/csh/rc shells, вы получите в качестве вывода /current/wd/* . Кроме того, поскольку символ новой строки действителен, как и любой в пути к файлу, если вы разделите пути к файлам символами новой строки, вы не сможете использовать полученный файл для надежного возврата к списку файлов.

С оболочкой zsh вместо этого вы можете сделать:

  print -rNC1 $ PWD/* (ND-.  )> listOfFiles.list  

Где:

  • -rC1 печатает r aw в 1 C столбец.
  • -N , выходные записи разделены NUL вместо разделителей новой строки (строки), поскольку NUL — единственный символ, который не может быть найден в имени файла.
  • N : заменяется на ничто, если нет подходящего файла ( nullglob ).
  • D : включать скрытые файлы ( dotglob ).
  • -. : включать только обычные файлы (. ) после разрешения символической ссылки ( - ).

Тогда вы сможете сделать что-то вроде:

  xargs -0 rm -f -  

Например, чтобы удалить эти файлы.

Вы можете также используйте модификатор : P в квалификаторах glob, чтобы получить эквивалент realpath () для файлов, развернутых из глобусов (получает полный путь, исключая любой компонент символической ссылки):

  print -rNC1 - * (ND - .: P)> listOfFiles. список  

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

   find "$ PWD" -type f> output  


К просматривать только обычные файлы —

  find "$ PWD" -type f> output  

Другой способ с tree , не упомянутый здесь, работает рекурсивно и, в отличие от find или ls, у вас нет ошибок (например: Permission denied , Not a directory ) вы также получите абсолютный путь на тот случай, если вы хотите передать файлы в xargs или другая команда

  tree -fai/pathYouWantToList> listOfFiles.list  

значения параметров:

  -a Все файлы распечатываются.  По умолчанию дерево не печатает скрытые файлы (начинающиеся с точки `. ').  Ни в коем случае дерево не печатает конструкции файловой системы `. '  (текущий каталог) и `.. '(предыдущий каталог) .- i Заставляет дерево не печатать строки отступа, полезно при использовании вместе с параметром -f. -f Печатает префикс полного пути для каждого файла.   

Чтобы установить tree :

sudo apt install tree в Ubuntu/Debian

дерево установки sudo yum в CentOS/Fedora

дерево установки sudo zypper в OpenSUSE


Другой способ с tree , не упомянутый здесь, выполняется рекурсивно и в отличие от find или ls, у вас нет ошибок (например: Permission denied , Not a directory ), вы также получаете абсолютный путь, если хотите передать файлы в xargs или другую команду

  tree -fai/pathYouWantToList> listOfFiles.list  

значения параметров:

  -a Все файлы pri  nted.  По умолчанию дерево не печатает скрытые файлы (начинающиеся с точки `. ').  Ни в коем случае дерево не печатает конструкции файловой системы `. '  (текущий каталог) и `.. '(предыдущий каталог) .- i Заставляет дерево не печатать строки отступа, полезно при использовании вместе с параметром -f. -f Печатает префикс полного пути для каждого файла.   

Чтобы установить tree :

sudo apt install tree в Ubuntu/Debian

дерево установки sudo yum в CentOS/Fedora

дерево установки sudo zypper в OpenSUSE


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

  ls |  xargs realpath  

Когда ls печатает в TTY, он форматирует имена файлов в столбцы, но когда он записывает в файл, канал или другой без TTY он ведет себя как ls -1 и печатает по одному имени файла в каждой строке. Вы можете проверить это, запустив ls | cat вместо ls.[1pting

  • xargs создает и выполняет командные строки из стандартного ввода.
  • realpath : возвращает канонизированный абсолютный путь
  • readlink : прочитать значение символьной ссылки.
  • Используйте realpath - , чтобы он обрабатывал все, что следует, как параметры вместо параметров, если файлы могут содержать « -something ».
  • Если в некоторых файлах есть пробелы, вы можете:
      ls |  xargs -I {} realpath - {}  


Вы можете просто использовать realpath или readlink этим непослушным способом:

  ls |  xargs realpath  

Когда ls печатает в TTY, он форматирует имена файлов в столбцы, но когда он записывает в файл, канал или другой без TTY он ведет себя как ls -1 и печатает по одному имени файла в каждой строке. Вы можете проверить это, запустив ls | cat вместо ls.[1pting

  • xargs создает и выполняет командные строки из стандартного ввода.
  • realpath : возвращает канонизированный абсолютный путь
  • readlink : прочитать значение символьной ссылки.
  • Используйте realpath - , чтобы он обрабатывал все, что следует, как параметры вместо параметров, если в файлах может быть « -something «.
  • Если в некоторых файлах есть пробелы, вы можете:
      ls |  xargs -I {} realpath - {}  

В прошлой среде Linux у меня была команда resolve , которая стандартизировала пути, включая преобразование относительного пути в абсолютный. Я не могу найти его сейчас, так что, возможно, он был написан кем-то в этой организации.

Вы можете создать свой собственный сценарий, используя функции в стандартных библиотеках Python или Perl (и, возможно, на других языках тоже) .

resolve.py :

  #!/bin/env pythonimport sysimport os.path для пути в  sys.argv: print os.path.abspath (путь)  

resolve.pl :

  #!/bin/env perluse warnings; используйте Cwd qw (abs_path); foreach (@ARGV) {print abs_path ($ _), " n";}  

Затем вы должны решить свою проблему с помощью:

  resolve.py *> listOfFiles.list  

С помощью этой команды вы также можете делать такие вещи:

  cd/root/dir1/dir2/dir3resolve.py ../../dir4/foo.txt# печатает /корень/каталог1/каталог4/foo. txt  


В прошлой среде Linux у меня было решение команда, которая стандартизирует пути, включая преобразование относительного пути в абсолютный. Я не могу найти его сейчас, так что, возможно, он был написан кем-то в этой организации.

Вы можете создать свой собственный сценарий, используя функции в стандартных библиотеках Python или Perl (и, возможно, на других языках тоже) .

resolve.py :

  #!/bin/env pythonimport sysimport os.path для пути в  sys.argv: print os.path.abspath (путь)  

resolve.pl :

  #!/bin/env perluse warnings; используйте Cwd qw (abs_path); foreach (@ARGV) {print abs_path ($ _), " n";}  

Затем вы должны решить свою проблему с помощью:

  resolve.py *> listOfFiles.list  

С помощью этой команды вы также можете делать такие вещи:

  cd/root/dir1/dir2/dir3resolve.py ../../dir4/foo.txt# печатает /root/dir1/dir4/foo.txt  

Рекурсивные файлы могут быть перечислены многими пути в линусе. Здесь я использую один лайнер-скрипт для очистки всех журналов файлов (только файлов) из каталога/var/log/и вторую недавно проверяю, какой файл журналов сделал запись.

Первое: —

  find/var/log/-type f # рекурсивный список файлов  

Второй: —

   для i в $ (найдите $ PWD -тип f);  сделать cat/dev/null> "$ i";  done # пустые файлы рекурсивно  

Третье использование: —

  ls -ltr $ (find/var/log/-type f  ) # список файлов, использованных в недавнем  

примечании: для местоположения каталога вы также можете передать $ PWD вместо/var/log.


Рекурсивные файлы можно перечислить в linus разными способами. Здесь я использую один лайнер-скрипт для очистки всех журналов файлов (только файлов) из каталога/var/log/и вторую недавно проверяю, какой файл журналов сделал запись.

Первое: —

  find/var/log/-type f # рекурсивный список файлов  

Второй: —

   для i в $ (найдите $ PWD -тип f);  сделать cat/dev/null> "$ i";  done # пустые файлы рекурсивно  

Третье использование: —

  ls -ltr $ (find/var/log/-type f  ) # список файлов, использованных в недавнем  

примечании: для местоположения каталога вы также можете передать $ PWD вместо/var/log.


Чтобы перечислить полный путь ко всем командам (приложениям/программам), доступным пользователю … (исправлено для устранения большинства, но не всех ограничений, перечисленных в комментариях)

  eval ls -d $ (echo $ PATH | sed -e 's |  ^: |.: | '-e' s |: $ |:.: | '-e' s |: |/{. ,} [[: word:]] * | g ') 2>/dev/null |  sort  

ПРИМЕЧАНИЕ
ПУТЬ переменная обычно имеет двоеточие (: ) либо в начале, либо в конце, но не в обоих случаях. Двоеточие в начале или в конце означает поиск в текущем каталоге. Стандартная практика — это быть в конце, чтобы никогда не перекрывать стандартные служебные программы. Подстановки sed здесь обрабатывают любой случай.

Объяснение …

  • eval
    Честно говоря, я не знаю, зачем здесь нужен eval , но это так. Без него я получаю …

ls: не могу получить доступ к ‘./{.,} [[: Word:]] ‘ : Нет такого файла или каталога
ls: нет доступа ‘/home/alpha/bin/{.}[[:word:]]
‘: нет такого файла или каталога
ls: нет доступа к ‘/usr/local/sbin/{.,} [[: word:]] ‘: нет такого файла или каталога
ls: нет доступа к ‘/usr/local/ bin/{.,} [[: word:]]
‘: нет такого файла или каталога
ls: нет доступа’/usr/sbin/{.}[[:word:]] ‘: нет такого файла или каталога
ls: нет доступа’/usr/bin/{.,}[[:word:]]
‘: нет такого файла или каталога
ls: нет доступа к ‘/sbin/{.,} [[: word:]] ‘: нет такого файла или каталога
ls: нет доступа к ‘/bin/{. ,} [[: word:]]
‘: нет такого каталога файлов

  • ls -d
    Список каталогов. Параметр -d на самом деле не просто перечисляет каталоги. Добавляя /* к каждому каталогу (см. Ниже), мы получим содержимое каталогов.
  • $ (...) Выполните команды внутри скобок и замените $ (...) на результаты для использования ls .
    • $ (echo: $ PATH | sed -e 's | ^: |.: |' -e 's |: $ |:.: |' -e 's |: |/ {.,} [[: word:]] * | g ')
      • Создает список шаблонов каталогов, разделенных пробелами, например …
          ./{.,} [[: word:]] */home/alpha/bin/{.,}[[:word: sizes ]**/usr/local/sbin/{.,} [[:  word:]] */usr/local/bin/{.,}[[:word: sizes ]**/usr/sbin/{.}[[:word: sizes ]**/usr/bin/{.,}  [[: word:]] */sbin/{.}[)[:word: fasten ]**/bin/{.}[:word: sizes ]*  
      • echo $ PATH
        Переменная среды PATH содержит список всех каталогов, разделенных двоеточиями, в которых будет выполняться поиск команд.
      • sed
        Утилита редактора потоков. Следующие варианты подстановки -e обрабатываются последовательно, так что результаты каждого доступны для следующего. Таким образом, :.: , вставленный вторым, позволяет заменять двоеточия шаблоном в третьем.
      • -e 's | ^: |.: | '
        Если PATH начинается с двоеточия (: ), замените его на .:
      • -e |: $ |:. : | '
        Если PATH заканчивается двоеточием (: ), замените его на :. :
      • -e 's |: |/{.,} [[: word:]] * | g
        Замените каждое двоеточие (: ) на /{.,} [[: Word:]] * . Этот шаблон включает файлы, начинающиеся с точки (. ), за которой следует любое количество буквенно-цифровых символов или символов подчеркивания. Дополнительная запятая (, ) в {.,} — это причуда bash 5.0.18 , как и ожидалось список или диапазон, разделенный запятыми. Здесь мы используем замену скобок, чтобы сделать точку (. ) необязательной.
      • 2>/dev/null
        Удалять сообщения об ошибках.
  • | sort
    При желании отсортируйте вывод предыдущей команды.


Чтобы перечислить полный путь ко всем командам (приложениям/программам), доступным пользователю … (исправлено для устранения большинства, но не всех ограничений, изложенных в комментарии)

  eval ls -d $ (echo $ PATH | sed -e 's | ^: |.: |' -e 's |:  $ |:.: | '-e' s |: |/{.,} [[: word:]] * | g ') 2>/dev/null |  sort  

ПРИМЕЧАНИЕ
ПУТЬ переменная обычно имеет двоеточие (: ) либо в начале, либо в конце, но не в обоих случаях. Двоеточие в начале или в конце означает поиск в текущем каталоге. Стандартная практика — это быть в конце, чтобы никогда не перекрывать стандартные служебные программы. Подстановки sed здесь обрабатывают любой случай.

Объяснение …

  • eval
    Честно говоря, я не знаю, зачем здесь нужен eval , но это так. Без него я получаю …

ls: не могу получить доступ к ‘./{.,} [[: Word:]] ‘ : Нет такого файла или каталога
ls: нет доступа ‘/home/alpha/bin/{.}[[:word:]]
‘: нет такого файла или каталога
ls: нет доступа к ‘/usr/local/sbin/{.,} [[: word:]] ‘: нет такого файла или каталога
ls: нет доступа к ‘/usr/local/ bin/{.,} [[: word:]]
‘: нет такого файла или каталога
ls: нет доступа’/usr/sbin/{.}[[:word:]] ‘: нет такого файла или каталога
ls: нет доступа’/usr/bin/{.,}[[:word:]]
‘: нет такого файла или каталога
ls: нет доступа к ‘/sbin/{.,} [[: word:]] ‘: нет такого файла или каталога
ls: нет доступа к ‘/bin/{. ,} [[: word:]]
‘: нет такого каталога файлов

  • ls -d
    Список каталогов. Параметр -d на самом деле не просто перечисляет каталоги. Добавляя /* к каждому каталогу (см. Ниже), мы получим содержимое каталогов.
  • $ (...) Выполните команды внутри скобок и замените $ (... ) с результатами для использования ls .
    • $ (echo: $ PATH | sed -e 's | ^: |.: | '-e' s |: $ |:.: | '-e' s |: |/{.,} [[: word:]] * | g ')
      • Создает список шаблонов каталогов, разделенных пробелами, например …
          ./{.,} [[: word:]] */home/alpha/ bin/{.,} [[: word:]] */usr/local/sbin/{.,}[[:word: sizes ]**/usr/local/bin/{.}[[:word:])  ] */usr/sbin/{.}[[:word: sizes ]**/usr/bin/{.,}[[:word: sizes ]**/sbin/{.}[[:word:]])  */bin/{.,}[[:word: sizesune )*
      • echo $ PATH
        Переменная среды PATH содержит разделенный двоеточиями список всех каталогов, в которых будет производиться поиск команд.
      • sed
        Утилита редактора потоков. Следующие варианты подстановки -e обрабатываются последовательно, так что результаты каждого доступны для следующего. Таким образом, :.: , вставленный вторым, позволяет заменять двоеточия шаблоном в третьем.
      • -e 's | ^: |.: | '
        Если PATH начинается с двоеточия (: ), замените его на .:
      • -e 's |: $ |:.: |'
        Если PATH заканчивается двоеточием (: ), замените его на :.:
      • -e |: |/{.,} [[: word:]] * | g
        Заменить каждое двоеточие (: ) на /{.,} [[: word:]] * . Этот шаблон включает файлы, начинающиеся с точки (. ), за которой следует любое количество буквенно-цифровых символов или символов подчеркивания. Дополнительная запятая (, ) в {.,} — это причуда bash 5.0.18 , как и ожидалось список или диапазон, разделенный запятыми. Здесь мы используем замену скобок, чтобы сделать точку (. ) необязательной.
      • 2>/dev/null
        Удалять сообщения об ошибках.
  • | sort
    При желании отсортируйте вывод предыдущей команды.

Оцените статью
techsly.ru
Добавить комментарий