рекурсивный список файлов в cli linux с указанием пути относительно текущего каталога

<p>это похоже на <a href="https://stackoverflow.com/questions/105212/linux-recursively-list-all-files-in-a-directory-including-files-in-symlink-dire">этот вопрос</a> , но я хочу включить путь относительно текущего каталога в unix. если я сделаю следующее:</p><pre><code>ls -lr | grep .txt </code></pre><p>это не включает полные пути. например, у меня есть следующая структура каталогов:</p><pre><code>test1/file.txt test2/file1.txt test2/file2.txt </code></pre><p>код выше вернет:</p><pre><code>file.txt file1.txt file2.txt </code></pre><p>как я могу заставить его включать пути относительно текущего каталога, используя стандартные команды unix?</p>

<p>используйте find:</p><pre><code>find . -name \*.txt -print </code></pre><p>в системах, использующих gnu find, как и в большинстве дистрибутивов gnu/linux, вы можете не указывать -print.</p>

<p>используйте <code>tree</code>, с <code>-f</code> (полный путь) и <code>-i</code> (без отступов):</p><pre><code>tree -if --noreport . tree -if --noreport directory/ </code></pre><p>затем вы можете использовать <code>grep</code>, чтобы отфильтровать те, которые вы хотите.</p><hr><p>если команда не найдена, вы можете установить ее:</p><p>введите следующую команду, чтобы установить команду дерева на rhel/centos и fedora linux:</p><pre><code># yum install tree -y </code></pre><p>если вы используете debian/ubuntu, введите в свой терминал mint linux следующую команду:</p><pre><code>$ sudo apt-get install tree -y 

попробуйте find. вы можете посмотреть это точно на странице руководства, но это как-то так:find [start directory] -name [what to find]так что для вашего примераfind . -name ".txt"должен дать вам то, что вы хотите.

вы можете использовать вместо поиска:find . -name '.txt' 

это делает трюк:ls -r1 $pwd | while read l; do case $l in :) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"</code></p><p>но он делает это, "грешив" с помощью синтаксического анализа <code>ls</code>, что считается плохой формой сообществами gnu и ghostscript.</p>

<pre><code>dir=your\_path find $dir | sed 's:""$dir""::' </code></pre><p>'sed' удалит 'your\_path' из всех результатов 'find'. и вы получаете относительно пути "dir".</p>

<p>чтобы получить действительные полные имена файлов нужных файлов с помощью команды find, используйте ее с командой pwd:</p><pre><code>find $(pwd) -name .txt -print 

найдите файл с именем "filename" в вашей файловой системе, начав поиск с корневого каталога "/". "имя файла"find / -name "filename" 

вы можете создать функцию shell, например, в вашем .zshrc или .bashrc:<pre class="lang-sh prettyprint-override">filepath() { echo $pwd/$1 } filepath2() { for i in $@; do echo $pwd/$i done } </code></pre><p>первый будет работать только на отдельные файлы, очевидно.</p>

<p>вот perl-скрипт:</p><pre class="lang-pl prettyprint-override"><code>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(); </code></pre><p>использование:</p><pre><code>ls -lr | perl format\_ls-lr.pl </code></pre>

<p>если вы хотите сохранить подробности, включите в вывод ls, например, размер файла и т.д., это должно сработать.</p><pre><code>sed "s|<oldpath>|<newpath>|g" input\_file > output\_file </code></pre>

<p>вы можете реализовать эту функцию, как это<br> во-первых, с помощью команды ls указали на целевой каталог. позже с помощью команды find отфильтруйте результат. в вашем случае это звучит так - всегда имя файла начинается с word <code>file***.txt</code></p><pre><code>ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search) </code></pre>

<p>в оболочке <a href="https://fishshell.com/">fish</a> вы можете сделать это для рекурсивного перечисления всех pdf-файлов, в том числе в текущем каталоге:</p><pre class="lang-sh prettyprint-override"><code>$ ls **pdf </code></pre><p>просто удалите "pdf", если вы хотите файлы любого типа.</p>