Excluindo um arquivo do UNIX “find” resulta baseado na existência de outro arquivo

1

Eu tenho um monte de diretórios, cada um com uma série de arquivos .pdf. Alguns desses arquivos foram convertidos com sucesso para .csv, outros não. Um exemplo de listagem de diretório usando find ./ :

./test5.pdf.csv
./test6.pdf
./test1.pdf.csv
./test3.pdf
./test1.pdf
./test3.pdf.csv
./test4.pdf.csv
./test7.pdf
./test2.pdf
./test5.pdf
./test4.pdf
./test2.pdf.csv
./test8.pdf

Como eu retornaria uma lista de arquivos que não foram convertidos com sucesso?

Em outras palavras, quais são os arquivos que não têm uma contraparte em .csv.pdf?

Neste exemplo, seria o teste {6,7,8} .pdf.

    
por aendrew 23.01.2014 / 17:41

2 respostas

5

Veja como funciona com a localização:

find . -name "*.pdf" | while read F; do test -f "${F}.csv" || echo "$F"; done

O uso de find é preferível ao shell globbing, já que não tem limitação no número de argumentos e funciona com espaços e caracteres especiais.

    
por 23.01.2014 / 21:45
3

Não consegui encontrar uma maneira de fazer isso com find diretamente, mas é muito fácil usar um loop for:

for file in *.pdf; do [ -f ${file}.csv ] || echo $file; done

Se você precisar executá-lo no diretório principal e fazer com que ele seja recursivo, você poderá usar o seguinte:

for file in $(find . -iname '*.pdf'); do [ -f ${file}.csv ] || echo $file; done

que produziria algo assim:

./dir2/test7.pdf
./dir2/test6.pdf
./dir2/test8.pdf
./dir3/test7.pdf
./dir3/test6.pdf
./dir3/test8.pdf
./dir1/test7.pdf
./dir1/test6.pdf
./dir1/test8.pdf

Cuidado com esse último, porém, se você não tiver certeza de que não haverá caracteres estranhos nos nomes dos arquivos de entrada, certifique-se de definir Variável de ambiente do IFS que está sendo codificada:

OFS=$IFS
export IFS=$'\n'

Claro que, daqui em diante, só fica mais desagradável.

Eu estou supondo que você use bash.

    
por 23.01.2014 / 19:09