Como eu uso 'find' para ir para o diretório desse arquivo?

11

Eu quero encontrar um arquivo e, em seguida, entrar no diretório que o contém. Eu tentei find /media/storage -name "Fedora" | xargs cd , mas é claro, eu o erro is not a directory .

Como eu insiro seu diretório pai com um comando de uma linha?

    
por Hrvoje T 14.01.2017 / 23:53

4 respostas

14

Pelo menos se você tiver o GNU find , você pode usar -printf '%h' para obter o diretório

       %h     Leading directories of file's name (all but the last ele‐
              ment).  If the file name contains no slashes (since it is
              in  the  current  directory)  the %h specifier expands to
              ".".

Então você provavelmente poderia fazer

cd "$(find /media/storage -name "Fedora" -printf '%h' -quit)"

O -quit deve evitar vários argumentos para cd no caso de mais de um arquivo corresponder.

    
por 15.01.2017 / 00:05
6

Similar à solução steeldriver's mas usando -execdir (se o seu find suportar, como o find do GNU ou do FreeBSD) em combinação com pwd :

cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"

-quit é opcional no caso de haver apenas um único resultado e rastrear todo o diretório, não há problema. No NetBSD é -exit e no OpenBSD não existe.

    
por 15.01.2017 / 00:15
5

Você pode fazer com que o find execute um novo shell no diretório que encontrar.

exec find /media/storage -name "Fedora" -execdir "$SHELL" \;

, após o qual o diretório atual será aquele que tem um arquivo chamado Fedora nele. ;)

Obviamente, isso só faz algo parecido com o que você deseja se estiver digitando comandos interativamente.

    
por 15.01.2017 / 04:40
4

com zsh :

cd /media/storage/**/Fedora([1]:h)

para cd no primeiro diretório (em ordem alfabética) que contém um arquivo chamado Fedora .

  • ** : qualquer nível de diretórios (os diretórios ocultos são omitidos por padrão, use o qualificador D glob para incluí-los)
  • [1] : apenas o primeiro
  • :h : modificador head : use o dirname.

Ao contrário de cd "$(find ...)" , também funciona se o nome do diretório terminar em um caractere de nova linha. Outra vantagem é que você receberia uma mensagem de erro no match quando não houvesse um diretório correspondente (enquanto na maioria dos shells, o cd "" não faria nada em silêncio).

Uma desvantagem é que ele rastrearia todo o /media/storage antes de retornar.

    
por 15.01.2017 / 14:58