Eu tenho uma pasta pai chamada "parent_folder" com muitas subpastas, nessas subpastas existe um arquivo chamado "foo.mp4".
Eu posso encontrar esses arquivos facilmente fazendo o seguinte:
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?
-printf
%h
Diretórios principais do nome do arquivo (todos, exceto o último elemento). Se o nome do arquivo não contiver barras (já que está no diretório atual), o especificador% h será expandido para "." .find ./ -name "foo.mp4" -printf "%h\n"
imprimirá o caminho para cada arquivo encontrado (um por linha). Mais do que o habitual, ninguém usa,-exec echo {}
portanto, existe-print
(padrão omitido) ouprintf
ação.-printf
é apenas GNU. Os OPs mencionam o OS / X (um sistema BSD).Respostas:
Com
GNU
encontrar:Com outros
find
s, os nomes de diretório fornecidos não contêm caracteres de nova linha:Ou:
embora isso signifique executar um
dirname
comando por arquivo.Se você precisar executar um comando
path
, poderá fazer (sintaxe padrão):Embora neste caso, você possa usar
-execdir
(uma extensão BSD também disponível no GNUfind
), quechdir()
é o diretório do arquivo:Cuidado, porém, embora a implementação do GNU
find
se expanda{}
para./filename
aqui, os do BSD se expandam parafilename
. Tudo bem aqui, já que o nome do arquivo é passado como argumento para uma opção e sempre éfeatured.mp4
assim mesmo, mas para outros usos, talvez seja necessário levar em consideração 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 pelo awk, por exemplo), ou outros caracteres que causam esse tipo de problemaperl -p/n
(nem todos eles foram corrigidos pelo prefixo do GNUfind
,./
nesse caso), etc, que talvez você precise levar em consideração .fonte
find .
, como dirname você terá. em vez de todo o caminho.find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \;
Estou usando a segunda sugestão que você mencionou.O comando abaixo também pode ser usado para buscar apenas os detalhes do diretório.
fonte