bash find: obtém o diretório do arquivo encontrado

8

Eu tenho uma pasta pai chamada "parent_folder" com muitas subpastas, nessas subpastas há um arquivo chamado "foo.mp4".

Eu posso encontrar esses arquivos facilmente fazendo isso:

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;

Agora que retorna o caminho de cada arquivo, relativo a parent_folder /

./path/to/foo.mp4

Como posso retornar apenas o caminho, sem o nome do arquivo?

    
por dubbelj 23.01.2015 / 11:27

2 respostas

13

Com GNU find:

 find . -name foo.mp4 -printf '%h\n'

Com outros find s, desde que os nomes dos diretórios não contenham caracteres de nova linha:

 find . -name foo.mp4 | sed 's|/[^/]*$||'

Ou:

 find . -name foo.mp4 -exec dirname {} \;

embora isso signifique executar um comando dirname por arquivo.

Se você precisar executar um comando nesse path , você pode fazer (sintaxe padrão):

 find . -name "featured.mp4" -exec sh -c '
   for file do
     dir=${file%/*}
     ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
   done' sh {} +

Embora, nesse caso, você possa usar -execdir (uma extensão BSD também disponível no GNU find ), que chdir() s está no diretório do arquivo:

 find . -name "featured.mp4" -execdir \
   ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
No entanto, tenha em atenção que enquanto a implementação GNU de find irá expandir {} para ./filename aqui, os do BSD expandem para filename . Tudo bem aqui, pois o nome do arquivo é passado como argumento para uma opção e é sempre featured.mp4 , mas para outros usos você pode ter que considerar que o nome do arquivo pode começar com - ou + (e ser entendido como uma opção pelo comando) ou conter = (e ser entendido como uma atribuição de variável por awk, por exemplo), ou outros caracteres causando esse tipo de problema com perl -p/n (nem todos eles são fixados pelo prefixo find do GNU ./ , embora nesse caso), etc, o que você pode ter que levar em conta.

    
por 23.01.2015 / 11:45
-1

Abaixo, o comando também pode ser usado para buscar apenas os detalhes do diretório.

find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev
    
por 09.11.2018 / 11:16

Tags