Перечислить файлы рекурсивно в CLI Linux с указанием пути к текущему каталогу


5 Answers

Используйте tree с -f (полный путь) и -i (без отступов):

tree -if --noreport .
tree -if --noreport directory/

Затем вы можете использовать grep для фильтрации тех, которые вы хотите.

Если команда не найдена, вы можете установить ее:

Введите следующую команду для установки команды дерева на RHEL / CentOS и Fedora linux:

# yum install tree -y

Если вы используете Debian / Ubuntu, Mint Linux введите следующую команду в своем терминале:

$ sudo apt-get install tree -y
Question

Это похоже на этот вопрос , но я хочу включить путь относительно текущего каталога в unix. Если я сделаю следующее:

ls -LR | grep .txt

Он не включает в себя полные пути. Например, у меня есть следующая структура каталогов:

test1/file.txt
test2/file1.txt
test2/file2.txt

Вышеприведенный код вернет:

file.txt
file1.txt
file2.txt

Как я могу заставить его включать пути относительно текущего каталога, используя стандартные команды Unix?




Вы можете реализовать эту функцию следующим образом:
Во-первых, использование команды ls указывает на целевой каталог. Позже с помощью команды find откройте результат. Из вашего случая это звучит так: всегда имя файла начинается со словарного file***.txt

ls /some/path/here | find . -name 'file*.txt'   (* represents some wild card search)



Найдите файл с именем «filename» в вашей файловой системе, начиная поиск из корневого каталога «/». «Имя файла»

find / -name "filename" 



Вот сценарий Perl:

sub format_lines($)
{
    my $refonlines = shift;
    my @lines = @{$refonlines};
    my $tmppath = "-";

    foreach (@lines)
    {
        next if ($_ =~ /^\s+/);
        if ($_ =~ /(^\w+(\/\w*)*):/)
        {
            $tmppath = $1 if defined $1;    
            next;
        }
        print "$tmppath/$_";
    }
}

sub main()
{
        my @lines = ();

    while (<>) 
    {
        push (@lines, $_);
    }
    format_lines(\@lines);
}

main();

Применение:

ls -LR | perl format_ls-LR.pl



Вместо этого вы можете использовать find:

find . -name '*.txt'



DIR=your_path
find $DIR | sed 's:""$DIR""::'

«sed» удалит «ваш_path» из всех результатов поиска. И вы получаете относительно пути «DIR».






Related