AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 432627
Accepted
alhelal
alhelal
Asked: 2018-03-22 08:41:45 +0800 CST2018-03-22 08:41:45 +0800 CST 2018-03-22 08:41:45 +0800 CST

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

  • 772

Suponha que eu tenha um diretório chamado Titlepageque tenha muitos arquivos chamados titlepage_1.pdf, titlepage_2.pdf... titlepage_n.pdfe seus texarquivos também. Eu tenho uma função bash que altera dois nomes de arquivo. (por exemplo $alterpdf 2 3, este comando troca o nome do arquivo titlepage_2.pdfpor titlepage_3.pdf. E faz a mesma coisa para os texarquivos 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.pdfdentro titlepage_2.pdfe titlepage_3.pdfcom o nome titlepage_3.pdf. E o número dos próximos arquivos é aumentado. titlepage_3.pdfpara titlepage_4.pdf titlepage_4.pdfpara titlepage_5.pdfe assim por diante.

Há também um .texarquivo para todos os pdf nesse diretório.

Editar
eu quero implementar segue-

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 pela cauda, ​​incrementa 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) paratitlepage_3rd_argement_of_push.pdf

bash rename
  • 2 2 respostas
  • 85 Views

2 respostas

  • Voted
  1. Best Answer
    hhoke1
    2018-03-24T07:38:51+08:002018-03-24T07:38:51+08:00

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

    #!/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
    
    • 2
  2. hhoke1
    2018-03-22T10:23:30+08:002018-03-22T10:23:30+08:00

    que pode inserir new.pdfdentro titlepage_2.pdfetitlepage_3.pdf

    Portanto, para esclarecer, você deseja inserir new.pdf entre os dois arquivos de página de título e produzir um novo arquivo, página de título_3.pdf, mover a página de título_3.pdf original para uma página de título_4.pdf e incrementar o número do restantes arquivos pdf com nomes semelhantes?

    Em outras palavras, queremos ficar com 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 depois 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 estilo perl e o renamecomando.

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

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve