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

179

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

ls -LR | grep .txt

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

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

Приведённый выше код вернет:

file.txt
file1.txt
file2.txt

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

  • 4
    Это просто показывает, что в ls отсутствует эта функция.
  • 0
    Обидно, что все эти решения требуют find или tree . Я ssh'ing в устройство Android, где у меня, кажется, есть только ls , и ни один из этих других инструментов: /
Теги:
recursion
ls

12 ответов

233
Лучший ответ

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

find . -name \*.txt -print

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

  • 9
    ... и в этом отношении вы можете опустить "."
  • 5
    Для абсолютных путей используйте find $(pwd) -name \*.txt
Показать ещё 3 комментария
57

Используйте 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
  • 1
    какие-либо настройки, чтобы перечислить только файлы и исключить папки?
22

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

find [start directory] -name [what to find]

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

find . -name "*.txt"

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

8

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

find . -name '*.txt'
5

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

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"

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

  • 0
    Я действительно не понимаю последнее предложение ...
  • 2
    @CAFEBABE: считается, что анализ результатов ls считается табу, потому что это обычно приводит к ошибкам. Соответствующее предложение пыталось это высказать. У этого также была шутка в этом, который я удалил.
4
DIR=your_path
find $DIR | sed 's:""$DIR""::'

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

  • 0
    это именно то, что мне нужно, но он все равно показывает мне полный путь?
  • 1
    не используйте апостроф - find / tmp | sed s: "/ tmp" :: | Больше
3

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

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

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

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

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

find / -name "filename" 
1

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

filepath() {
    echo $PWD/$1
}

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

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

1

Вот Perl script:

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
  • 0
    Это ужасная программа на Perl. Это, вероятно, в 2-3 раза длиннее и сложнее, чем нужно.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню