Usando o basename para extrair a extensão do arquivo e procurar por arquivos com o mesmo nome

3

Basicamente, eu tenho uma pasta /test/ que tem vários arquivos do tipo .doc e .pdf . Alguns dos arquivos têm uma versão .pdf e .doc , como test.doc e test.pdf , enquanto outros só têm uma versão.

O que estou tentando fazer é encontrar ocorrências em que haja um .doc e excluir o .pdf correspondente usando um script.

Eu tenho mexido nessa linha de código:

find /test/ -name "*.doc" - exec basename {} .doc \; -exec rm {}.pdf \;

No entanto, isso retorna o erro de que não é possível localizar arquivos denominados example.doc.pdf em vez de excluir o apropriadamente nomeado .pdf do comando find. A razão pela qual estou tentando fazer isso é porque há .pdf arquivos que não possuem um arquivo .doc correspondente que eu não desejo excluir.

    
por Richard Good 13.10.2015 / 17:11

2 respostas

4

Você pode usar este comando find :

find /test/ -name "*.doc" -exec sh -c 'a="$1"; rm "${a%.doc}.pdf"' find-sh {} \;

Ele procurará por .doc arquivos no diretório /test/ . Para cada arquivo encontrado, um shell sh é chamado com o arquivo como argumento. ${a%.doc}.pdf substitui a extensão do arquivo .doc por .pdf e rm remove, se o arquivo existir.

    
por 13.10.2015 / 17:31
1

Salve o seguinte script como rm_dub.sh

#!/bin/sh

rm_dub() {
    dir=$(dirname -- "$1")
    base=$(basename -- "$1" "$2")

    rm -- "$dir/$base$3"
}

rm_dub "$@"

e usa-o com

find /test/ -name "*.doc" -exec sh rm_dub.sh {} .doc .pdf \;
    
por 13.10.2015 / 17:28