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

StackOverflow https://stackoverflow.com/questions/245698

  •  05-07-2019
  •  | 
  •  

Вопрос

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

ls -LR | grep .txt

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

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

Код выше вернет:

file.txt
file1.txt
file2.txt

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

Это было полезно?

Решение

Используйте find:

find . -name \*.txt -print

В системах, использующих GNU find, как и в большинстве дистрибутивов GNU / Linux, вы можете не указывать -print.

Другие советы

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

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

Затем вы можете использовать grep , чтобы отфильтровать те, которые вам нужны.

<Ч>

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

Введите следующую команду, чтобы установить команду дерева в Linux RHEL / CentOS и Fedora:

# yum install tree -y

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

$ sudo apt-get install tree -y

Попробуйте найти . Вы можете найти это точно на странице руководства, но это как-то так:

find [начальный каталог] -name [что найти]

так для вашего примера

найти. -name " *. txt "

должен дать вам то, что вы хотите.

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

find . -name '*.txt'

Это делает трюк:

ls -R1 $ PWD | пока читаю л; сделать регистр $ l в * :) d = $ {l%:} ;; ") d = ;; *) echo "$ d / $ l" ;; ESAC; сделано | grep -i " .txt "

Но это происходит с помощью "греха" однако, с помощью анализа ls , что считается сообществом GNU и Ghostscript дурным тоном.

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

'sed' сотрет 'your_path' со всех результатов 'find'. И вы получите относительно пути 'DIR'.

Чтобы получить действительные полные имена файлов нужных файлов с помощью команды find, используйте ее с командой pwd:

find $(pwd) -name \*.txt -print

Вот 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

Вы можете создать функцию оболочки, например, в вашем .zshrc или .bashrc :

filepath() {
    echo $PWD/$1
}

filepath2() {
    for i in $@; do
        echo $PWD/$i
    done
}

Первый, очевидно, будет работать только с отдельными файлами.

Найдите файл с именем " имя файла " В вашей файловой системе поиск начинается с корневого каталога " / " ;. & Quot; имя файла "

find / -name "filename" 

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

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file

Вы можете реализовать эту функцию, как это
Во-первых, команда ls указала на целевой каталог. Позже с помощью команды find отфильтруйте результат. С вашего случая это звучит так - всегда имя файла начинается со слова <Код> файл ***. TXT

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

В оболочке fish вы можете сделать это для рекурсивного вывода списка всех PDF-файлов, включая файлы в текущем каталоге.

$ ls **pdf

Просто удалите «pdf», если вы хотите файлы любого типа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top