Referência de um nome de caminho em resultados de saída 'find'

2

O que eu gostaria de fazer é referenciar um resultado do nome do caminho find como um parâmetro para outro comando sem digitar com dificuldade o nome completo do caminho. Exemplo:

$ find -name testfile  
path1  
path2  
path3  
$ cd path2

Como alguém pode fazer isso?

    
por cblupo 17.09.2014 / 04:05

2 respostas

0

No bash, se uma variável tiver o valor de um caminho completo para um arquivo (por exemplo, /home/spider/src/myscript.py), você poderá usar a manipulação de variáveis para obter o nome da base e o nome da pasta.

Então, por exemplo:

filepath='/home/spider/src/myscript.py'

filename=${filepath##*/}
echo $filename
myscript.py

path=${filepath%/*}
echo $path
/home/spider/src

Comando Bash builtin read, suporta a leitura de stdin em um array, com a opção -a, para que você possa usar isto:

IFS='$\n' read -d '' -a files < <(find . -name testfile -type f)

As variáveis do array de shell agora contêm todos os arquivos com seu caminho. Usando as construções de manipulação de string de shell anteriores, você pode fazer agora

cd ${files[2]%/*}

Para mudar para o caminho do segundo arquivo.

Algumas notas sobre o comando acima:

  • opção -d '' (esteja ciente do espaço entre -d e '') selecione o caractere nulo como delimitador para leitura.
  • opção -a, como visto acima, leia a entrada padrão em uma matriz indexada (denominada 'arquivos' neste caso)
  • < < (comando) redireciona a saída do comando entre < (e) para a entrada padrão. Isso é útil para leitura, para o qual você não pode canalizar.
  • Eu adicionei '-type f' ao comando find, para garantir que você receba apenas arquivos
  • Para referência operandos de manipulação de string no bash
  • Você pode usar o comando basename (1) e dirname (1), para o mesmo propósito, mas eles geram um novo processo, portanto, são um pouco menos eficientes.
por 18.09.2014 / 17:00
-1

Você pode executar o outro comando como parte da instrução find ?

find -name testfile -exec othercommand {} \;

{} é o caminho encontrado. Os argumentos para -exec precisam ser terminados com um ponto-e-vírgula, ; , mas você precisa escapar disso no bash com uma barra invertida, \ .

Este exemplo alteraria as permissões em todos os arquivos encontrados:

find -name testfile -exec chmod 755 {} \;
    
por 17.09.2014 / 05:34