Como criar diretórios curinga e todos os arquivos neles

0

Digamos que eu queria diretórios curinga e, em seguida, curinga todos os arquivos nesses diretórios.

Como eu faria isso?

Eu sei * é para curinga todos os arquivos, mas eu não sei como diretórios curinga.

Por exemplo, pdf2djvu -o /dir/[wildcard dirs]/[wildcards.djvu] /dir/[wildcard dirs]/[wildcards.pdf]

Em uma nota secundária, um caractere curinga pode ser afetado se o local tiver um espaço onde normalmente é necessário digitar "" para espaços, seria melhor usar \ - desta vez?

Eu tentei o que eu postei acima usando o padrão * para os diretórios curinga e arquivos curinga como /dir[entire dir had no spaces]/*/*.djvu , mas recebi o seguinte erro

I/O error (basic_ios::clear)

    
por user140393 01.04.2013 / 20:58

2 respostas

1

Uma solução possível é usar algo como:

find . -iname *.pdf | xargs -I% pdf2djvu -o % %.djvu

Isso encontraria todos os arquivos pdf começando no diretório atual (recursivo) e executaria o comando pdf2djvu para produzir os arquivos file.pdf.djvu.

    
por To Do 01.04.2013 / 23:18
0

O problema é que não há uma boa maneira de manter as duas expansões curinga em sincronia e iterar sobre elas, como você está querendo fazer. Como você só quer fazer isso em um arquivo de cada vez, seria mais fácil simplesmente usar find. Se você quiser recursivamente fazer isso, eu faria find . -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \; Se você tem apenas alguns diretórios que você quer fazer isso, venha com curinga shell que se expande para esses diretórios, e use isso como o argumento para encontrar em vez de% código%. Por exemplo, se você tem vários diretórios que terminam com "djvus" (como "pie_djvus" e "flag_djvus"):

find ./*djvus/ -maxdepth 1 -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \;

Usar o . após o glob garante que o glob corresponderá apenas aos diretórios e especificar a profundidade máxima de 1 garante que o find não vá mais do que um nível de profundidade nos diretórios especificados (que é o nível superior)

Em ambos os casos, você vai acabar com coisas como "file.pdf.djvu", que podem ou não ser irritantes para você. Então, haverá um segundo passo de pós-processamento necessário se você usou find. Aqui está uma maneira de fazer isso se você estiver usando um bash recente como seu shell (alguns shells irão dividir os nomes dos arquivos nos espaços, o que quebrará isso - mas o bash atual não o faz).

for F in *.pdf.djvu; do mv -v "$F" "${F%.pdf.djvu}.djvu"; done
    
por dannysauer 06.11.2015 / 16:52