如何在 bash 中创建一个在其他文件之间插入新文件名的函数?

如何在 bash 中创建一个在其他文件之间插入新文件名的函数?

假设,我有一个名为 的目录Titlepage,其中有许多名为titlepage_1.pdf, titlepage_2.pdf...的文件titlepage_n.pdf以及它们的tex文件。我有一个 bash 函数可以更改两个文件名。(例如,$alterpdf 2 3此命令将文件名交换titlepage_2.pdftitlepage_3.pdf. 并且对相应的文件也执行相同的操作tex。)

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; }  

filepush new.pdf 2 3现在,我想要一个可以插入new.pdf内部titlepage_2.pdftitlepage_3.pdf名称为 的函数(例如, ) titlepage_3.pdf。并且下一个文件的数量会增加。titlepage_3.pdftitlepage_4.pdf titlepage_4.pdftitlepage_5.pdf等等。

.tex该目录中 还有一个包含所有 pdf 的文件。

编辑
我想实施以下-

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

编辑
提议的解决方案

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

这将产生文件的索引。从尾部开始递增每个索引,为每个文件添加 1,直到插入点(第二个参数push)。然后将目标文件( new.pdf)重命名为titlepage_3rd_argement_of_push.pdf

答案1

好的,这是一个可以完成您想要的操作的脚本。

#!/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

可以插入new.pdf内部titlepage_2.pdftitlepage_3.pdf

因此,为了澄清,您希望能够将 new.pdf 夹在两个 titlepage 文件之间,并生成一个新文件 titlepage_3.pdf,并将原始 titlepage_3.pdf 移动到 titlepage_4.pdf,并增加剩余的 pdf 文件具有相似的名称吗?

换句话说,我们希望留下一个新列表,其中新的 titlepage_3.pdf 现在包含 titlepage_2.pdf 中的页面,然后是 new.pdf 中的页面,然后是 titlepage_3.pdf 中的页面?有几种方法可以连接 pdf你可以用这个。为了增加数字,我建议在串联步骤之前使用 perl 样式的正则表达式和命令执行此操作rename

对于 .tex 文件,我不确定您到底想要完成什么,但是这个链接可能有关于如何连接 tex 文件的有用信息。

相关内容