Подтвердить что ты не робот

Как рекурсивно перечислить все файлы и каталоги

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

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

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

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

4b9b3361

Ответ 1

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

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'

Ответ 2

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

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

tree -p -u -g -f -i

или

tree -p -u -g -f

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

Ответ 3

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

find $PWD -type f     

Ответ 4

find близок:

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

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

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

Ответ 5

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

find . -ls

Ответ 6

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

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

Ответ 7

Я нашел простой способ:

ls -lthr/path_to_directory/*

"*" - представляет уровни.

Ajiths-MBP:test ajith$ ls -lthr *
test2:
total 0
-rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test2.txt

test3:
total 0
-rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test3.txt

test1:
total 0
-rw-r--r--  1 ajith  staff     0B Oct 17 18:21 test1.txt
drwxr-xr-x  3 ajith  staff    96B Oct 17 18:22 test1_sub_dir


Ajiths-MBP:test ajith$ ls -lthr */*
-rw-r--r--  1 ajith  staff     0B Oct 17 18:21 test1/test1.txt
-rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test2/test2.txt
-rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test3/test3.txt

test1/test1_sub_dir:
total 0
-rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test1_sub_file.txt

Ответ 8

Используйте оболочку script. Или Perl script. Пример Perl script (потому что мне это проще):

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

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