Pergunta

Este é semelhante ao esta questão , mas eu quero incluir o caminho relativo para o diretório atual em unix. Se eu fizer o seguinte:

ls -LR | grep .txt

Não inclui os caminhos completos. Por exemplo, eu tenho a seguinte estrutura de diretório:

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

O código acima retornará:

file.txt
file1.txt
file2.txt

Como posso obtê-lo para incluir os caminhos relativos ao diretório atual usando comandos padrão do Unix?

Foi útil?

Solução

Use achado:

find . -name \*.txt -print

Em sistemas que encontrar o uso GNU, como a maioria das distribuições GNU / Linux, você pode deixar de fora o -print.

Outras dicas

Use tree, com -f (caminho completo) e -i (sem linhas de recuo):

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

Você pode então usar grep para filtrar o que deseja.


Se o comando não for encontrado, você pode instalá-lo:

Digite o comando a seguir para instalar comando árvore no RHEL / CentOS e Fedora Linux:

# yum install tree -y

Se você estiver usando Debian / Ubuntu, Mint tipo Linux seguinte comando em seu terminal:

$ sudo apt-get install tree -y

find tentativa. Você pode procurá-lo exatamente na página man, mas é sorta como este:

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

então por seu exemplo

find . -name "*.txt"

deve dar-lhe o que quiser.

Você pode usar encontrar em vez disso:

find . -name '*.txt'

Isso faz o truque:

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

Mas ele faz isso por "pecado" com a análise de ls, porém, que é considerado uma forma ruim pelas comunidades GNU e Ghostscript.

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

'sed' apaga 'seu_caminho' de todos os resultados 'encontrar'. E você recebe em relação ao caminho 'DIR'.

Para obter os nomes dos arquivos desejados usando o comando encontrar o arquivo caminho completo reais, usá-lo com o comando pwd:

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

Aqui está um script 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();

uso:

ls -LR | perl format_ls-LR.pl

Você pode criar uma função shell, por exemplo, em sua .zshrc ou .bashrc:

filepath() {
    echo $PWD/$1
}

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

O primeiro iria trabalhar em arquivos individuais somente, obviamente.

Encontre o arquivo chamado "filename" no seu sistema de arquivos iniciando a pesquisa do diretório raiz "/". O "nome do arquivo"

find / -name "filename" 

Se você quiser preservar os detalhes vêm com ls como tamanho do arquivo etc na sua saída, então isso deve funcionar.

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

Você pode implementar essa funcionalidade como esta
Em primeiro lugar, usando o ls comando apontou para o diretório alvejado. Mais tarde, usando filtro de comando find o resultado dela. Desde o seu caso, que parece - sempre o nome do arquivo começa com uma palavra file***.txt

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

Na shell peixe, você pode fazer isso para listar todos os pdfs de forma recursiva, incluindo os do diretório atual :

$ ls **pdf

Basta remover 'pdf' se você quer arquivos de qualquer tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top