Como pular um arquivo com uma extensão de arquivo específica se houver outro arquivo (com outra extensão) com exatamente o mesmo nome de arquivo?

1

Essencialmente, preciso criar um código que faça o backup dos arquivos. Uma das especificações é que, se houver um arquivo .pdf (vamos chamá-lo test1.pdf , por exemplo) e um arquivo .doc com o mesmo nome exato ( test1.doc ), o código destina-se a copiar somente a .doc file.

Aqui está o que eu tenho até agora, o código faz 90% do que ele deve fazer, exceto este requisito final. Eu usei um loop for:

for file in $(find "${sourcePath}" -name "*.pdf"); do
fileName=$(echo "${file}" | cut -d '.' -f1)
if $(find $(sourcePath) -name "${fileName}.doc" &>/dev/nulll; then
    echo "Sorry, a .doc file with that extension already exists, skipping copy"
    continue
fi
done

Tenho certeza de que as pessoas descobrirão instantaneamente por que ele não funciona (sou tão ruim assim), mas essencialmente o que esse loop está fazendo quando eu executo o script via bash -x é:

  1. Verifica arquivos com .pdf
  2. Remove o nome antes do .
  3. Verifica se há outros arquivos com o mesmo nome de arquivo antes do arquivo . e, se for um arquivo .doc , exibe uma mensagem de aviso
  4. O problema é que o código ainda copia os arquivos de qualquer maneira

Eu suspeito que é porque eu não especifiquei o que o código deve fazer se encontrar os dois arquivos.

Aqui está o meu código completo para referência.

#!/bin/bash
sourcePath=$1
destPath=$2
Filedoc="*.doc"
Filepdf="*.pdf"
FilePDF="*.PDF"

if [[ $# -ne 2 ]]; then
    echo "Usage ; dar doc_path archive_path"
    exit 1
fi

if [ ! -d sourcePath ]
    then echo Directory does not exist
fi

if [ ! -d destPath ]
    then mkdir -p $destPath
fi

for file in $(find "${sourcePath}" -type f -exec basename {} \; | sort | uniq -d); do
    num=1 
    fileName=$(echo "${file}" | cut -d '.' -f1)
    fileExtension=$(echo "${file}" | cut -d '.' -f2)
    dirName=$(dirname "${duplicate}")
    for duplicate in $(find "${sourcePath}" -name "${file}" | tail -n +2 ); do
            mv "${duplicate}" "${duplicate}${fileName}_${num}.${fileExtension}"
            echo "Renamed duplicate file ${duplicate} ${duplicate}_${num}.${fileExtension}"
            (( num = num + 1 ))
    done
done

for file in $(find "${sourcePath}" -name "*.pdf"); do
    fileName=$(echo "${file}" | cut -d '.' -f1)
    if $(find $(sourcePath) -name "${fileName}.doc" &>/dev/nulll; then
            echo "Sorry, a .doc file with that extension already exists, skipping copy"
            continue
        fi
done

find "${sourcePath}" -name "$Filedoc" -exec cp -r {} "${destPath}" \;
find "${sourcePath}" -name "$FilePDF" -exec cp -r {} "${destPath}" \;
    
por James Dean 09.11.2015 / 11:42

2 respostas

0

cd -P  -- "$destpath"   &&
cd -P  -- "$sourcepath" || exit; d= \
find . -type f -name \*.pdf -exec sh -c '
    for   f
    do    [ -e    "${f%.*}.doc" ]|| 
          ! case   ${f#"$d"}     in
            */*)   d=${f%/*}/
            mkdir -p "$0/$d"     ;:
            esac  || cp "$f" "$0/$f"
    done'  "$OLDPWD" {} +
pax -rws"|.*\.pdf$||" . "$OLDPWD"

... que primeiro copia individualmente todos os arquivos .pdf em "$sourcepath" a "$destpath" , que não são nomeados de forma idêntica a algum outro arquivo .doc e copia a árvore inteira de uma vez excluindo somente .pdf arquivos.

    
por 09.11.2015 / 14:30
-1

Não tente enganar o seu dever de casa.

Do jeito que eu faria: pesquise primeiro todos os arquivos pdf (em um loop), extraia o nome do arquivo de cada arquivo e verifique se existe um arquivo doc correspondente no mesmo caminho. Se o doc existe, copie apenas o arquivo doc, se não, copie o pdf.

Depois disso, recopie todos os arquivos doc (isso garantirá que você obtenha todos os arquivos doc que não tenham um arquivo pdf de backup).

Editar:

Este é um exemplo de pseudocódigo do que quero dizer:

sourcePath=$1
destinationPath=$2

for all pdf files in $sourcePath; do
    crt_file_without_extension
    if crt_file_without_extension.doc exists
        copy doc file to $destinationPath
    else
        copy pdf file to $destinationPath
    fi
done

copy all doc files to $destinationPath
    
por 09.11.2015 / 13:10

Tags