Как рекурсивно перечислить все файлы и каталоги - PullRequest
28 голосов
/ 01 февраля 2009

Используя оболочку tcsh на Free BSD, есть ли способ рекурсивного вывода списка всех файлов и каталогов, включая владельца, группу и относительный путь к файлу?

ls -alR подходит близко, но не показывает относительный путь перед каждым файлом, он показывает путь вверху группы, т.е.

owner% ls -alR
total 0
drwxr-xr-x   3 owner  group  102 Feb  1 10:50 .
drwx------+ 27 owner  group  918 Feb  1 10:49 ..
drwxr-xr-x   5 owner  group  170 Feb  1 10:50 subfolder

./subfolder:
total 16
drwxr-xr-x  5 owner  group   170 Feb  1 10:50 .
drwxr-xr-x  3 owner  group   102 Feb  1 10:50 ..
-rw-r--r--  1 owner  group     0 Feb  1 10:50 file1
-rw-r--r--  1 owner  group     0 Feb  1 10:50 file2

То, что я хотел бы, выводится как:

owner group ./relative/path/to/file

Принятый ответ на этот вопрос показывает относительный путь к файлу, но не показывает владельца и группу.

Ответы [ 7 ]

24 голосов
/ 01 февраля 2009

Как насчет этого:

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
19 голосов
/ 04 февраля 2009

Используйте дерево . Немногие дистрибутивы Linux устанавливают его по умолчанию (в эти темные дни только GUI :-), но он всегда доступен в стандартных репозиториях. Он также должен быть доступен для * BSD, см. http://mama.indstate.edu/users/ice/tree/

Использование:

tree -p -u -g -f -i

или

tree -p -u -g -f

или проверьте страницу руководства для множества других полезных аргументов.

17 голосов
/ 28 ноября 2012

Работает в Linux Debian:

find $PWD -type f     
10 голосов
/ 01 февраля 2009

find подходит близко:

find . -printf "%u %g %p\n"

Существует также «% P», который удаляет префикс из имени файла, если вы хотите, чтобы пути были относительно указанного каталога.

Обратите внимание, что это GNU find, я не знаю, поддерживает ли BSD find и -printf.

8 голосов
/ 20 марта 2011

У вас уже есть ответ, который работает, но для справки вы должны быть в состоянии сделать это на BSD (я тестировал его на Mac):

find . -ls
4 голосов
/ 01 февраля 2009

Если вы предпочитаете использовать Perl, не используйте его как оболочку для команд оболочки. Делать это на родном Perl быстрее, более переносимо и более гибко. Кроме того, он избегает специальных регулярных выражений.

use File::Find;
use File::stat;

find (\&myList, ".");

sub myList {
   my $st = lstat($_) or die "No $file: $!";

   print  getgrnam($st->gid), " ", 
          getpwuid($st->uid), " ", 
          $File::Find::name, "\n";
}
0 голосов
/ 01 февраля 2009

Используйте скрипт оболочки. Или скрипт Perl. Пример сценария Perl (потому что мне легче это сделать):

#!/usr/bin/perl
use strict;
use warnings;
foreach(`find . -name \*`) {
  chomp;
  my $ls = `ls -l $_`;
  # an incomprehensible string of characters because it's Perl
  my($owner, $group) = /\S+\s+\S+\s+(\S+)\s+(\S)+/;
  printf("%-10s %-10s %s\n", $owner, $group, $_);
}

Возможно, немного более многословно, чем другие ответы, но должно сработать и избавить вас от необходимости помнить, что печатать. (Код не проверен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...