Ответ 1
Как насчет этого:
find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
Используя оболочку 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
принятый ответ на этот вопрос показывает относительный путь к файлу, но не показывает владельца и группу.
Как насчет этого:
find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
Используйте дерево. Немногие дистрибутивы Linux устанавливают его по умолчанию (в эти темные дни только графические интерфейсы:-), но он всегда доступен в стандартных репозиториях. Он также должен быть доступен для * BSD, см. http://mama.indstate.edu/users/ice/tree/
Использование:
tree -p -u -g -f -i
или
tree -p -u -g -f
или проверьте справочную страницу для многих других полезных аргументов.
Работает в Linux Debian:
find $PWD -type f
find
близок:
find . -printf "%u %g %p\n"
Существует также "% P", который удаляет префикс из имени файла, если вы хотите, чтобы пути были относительно указанного каталога.
Обратите внимание, что это GNU find, я не знаю, поддерживает ли BSD также -printf.
У вас уже есть ответ, который работает, но для справки вы должны быть в состоянии сделать это на BSD (я протестировал его на Mac):
find . -ls
Если вы хотите использовать 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";
}
Я нашел простой способ:
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
Используйте оболочку 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, $_);
}
Возможно, немного более многословный, чем другие ответы, но должен сделать трюк, и должен спасти вас, чтобы помнить, что вводить. (Код не проверен.)