Como fazer uma função no bash que insere um novo nome de arquivo entre outros?

0

Suponha que eu tenha um diretório chamado Titlepage que tenha muitos arquivos chamados titlepage_1.pdf , titlepage_2.pdf ... titlepage_n.pdf e seus arquivos tex também. Eu tenho uma função bash que alteram dois nomes de arquivos (por exemplo, $alterpdf 2 3 este comando troca o nome de arquivo titlepage_2.pdf para titlepage_3.pdf . E faz a mesma coisa para os arquivos tex correspondentes também.)

function swap(){ mv $1 $1._tmp && mv $2 $1 && mv $1._tmp $2; }
function alterpdf(){ swap titlepage_$1.pdf titlepage_$2.pdf; swap titlepage_$1.tex titlepage_$2.tex; }  

Agora, quero uma função (por exemplo, filepush new.pdf 2 3 ) que possa inserir new.pdf dentro de titlepage_2.pdf e titlepage_3.pdf com o nome titlepage_3.pdf . E o próximo número de arquivos é aumentado. titlepage_3.pdf a titlepage_4.pdf titlepage_4.pdf a titlepage_5.pdf e assim por diante.

Há também um arquivo .tex para todo o pdf nesse diretório.

Editar
Eu quero implementar a seguir-

Titlepage$ ls
titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex titlepage_3.pdf
Titlepage$ vim new.tex
Titlepage$ pdflatex new.tex
Titlepage$ ls
new.pdf new.tex titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex 
titlepage_3.pdf
Titlepage$ push new.pdf 2 3
Titlepage$ ls
titlepage_1.tex titlepage_1.pdf titlepage_2.tex titlepage_2.pdf titlepage_3.tex titlepage_3.pdf titlepage_4.tex titlepage_4.pdf

Editar
solução proposta

$ls *.pdf|grep -Eo [0-9]+|sort -n  

Isso resulta no índice dos arquivos. Começando pelo incremento de cauda, cada índice adicionando 1 para cada arquivo até o ponto de inserção (2º argumento de push ). Em seguida, renomeie o arquivo de destino ( new.pdf ) para titlepage_3rd_argement_of_push.pdf

    
por alhelal 21.03.2018 / 17:41

2 respostas

2

OK, aqui está um script que faz algo parecido com o que você quer.

#!/bin/bash

NEWFILES=${1}
INSERT_IDX=${2}
PREFIX="titlepage_"

# just in case
prefixnum=${filebase//[^0-9]/}
case $prefixnum in
  (*[![:blank:]]*) echo "invalid prefix, contains numbers"; exit 1;;
esac

# check input arguments
if [ ! $# -eq 2 ];
then
  echo "USAGE: insert.sh <newfiles> <insertion_index>"
  echo 'example: insert.sh "new.pdf new.tex" 2'
  exit 1
fi

## process infiles
for infile in ${NEWFILES}
do
  ext=${infile##*.}
  for file in $(ls -1 ${PREFIX}[0-9]*.${ext} | sort -rV)
  do

      filebase=${file%.*}
      number=${filebase//[^0-9]/}
      numberless=${filebase//[0-9]/}

      if [ "${numberless}${number}.${ext}" != "${file}" ];
      then
        echo "invalid file ${file}"
        echo "${numberless}${number}.${ext}" "${file}"
        exit 1
      fi

      if [ ${number} -ge ${INSERT_IDX} ]
      then
          echo "$file" "${numberless}$((${number} + 1))".$ext
          mv "$file" "${numberless}$((${number} + 1))".$ext
      else
        echo ${file}
      fi
  done
  echo "${infile}"  "${PREFIX}${INSERT_IDX}.${ext}"
  mv "${infile}"  "${PREFIX}${INSERT_IDX}.${ext}"
done
    
por 23.03.2018 / 16:38
0

that can insert new.pdf inside titlepage_2.pdf and titlepage_3.pdf

Então, para esclarecer, você quer poder inserir new.pdf entre os dois arquivos da página de título, e produzir um novo arquivo, titlepage_3.pdf, e mover o original titlepage_3.pdf para um titlepage_4.pdf e incrementar o número dos arquivos pdf restantes com nomes semelhantes?

Em outras palavras, queremos deixar uma nova lista, onde o novo titlepage_3.pdf agora contém as páginas em titlepage_2.pdf, depois as páginas em new.pdf e as páginas em titlepage_3.pdf? Existem várias maneiras de concatenar pdfs que você pode usar para isso . Para incrementar os números, eu recomendaria fazer isso antes da etapa de concatenação, usando regex no estilo perl e o comando rename .

Para os arquivos .tex, não sei exatamente o que você está tentando realizar, mas este link pode ter informações úteis sobre como concatenar arquivos tex.

    
por 21.03.2018 / 19:23