如何使用命令行参数选择然后更改一组文件名

如何使用命令行参数选择然后更改一组文件名

我一直在使用一个放在我的用户/.bin 文件夹中的简单 shell 脚本;它的工作非常简单,复制指定的文件 $1 并重命名为 $2;至少我曾认为它是那么简单...

使用情况是这样的,我有一个用于编程笔记的文件命名法。该系统很简单,一个递增的数字后面跟着一个字母,文件名的其余部分只包含字母和下划线。某个主题的笔记称为:16115P-foobar.md,而该主题的代码文件为:16115P-foobar.c 16115P-barfoo.h 等。

随着程序随着每节课的进展,我会在修改之前复制所有程序文件;以便拥有课程每个步骤的文件。由于需要我使用课程主题修改程序;我做的第一件事就是复制和重命名文件。脚本应该复制每个文件并重命名它们,只更改序列号,这是我的标准命名法:

例如,16115P-foobar.c 要更改为 17121P-foobar.c ... 等等。

新号码由用户(仅我自己)通过第二个命令行参数指定;不由脚本自动执行。

#!/bin/bash

for filename in $1*
do
    #
    # Copy and rename files
    #
    newname=`echo "$filename" | tr "$1" "$2"`
    echo $filename $newname
    cp $filename $newname
done

当我像这样解析文件名时:

:~/blah/blah/code$ copy_and_rename 16115P 17121P
16115P-file.c 27221P-file.c
16115P-input.c 27221P-input.c
16115P-main.c 27221P-main.c
16115P-output.c 27221P-output.c
16115P-recordshop.h 27221P-recordshop.h
16115P-utils.c 27221P-utils.c

我现在发现这tr不是这里应使用的正确命令;我希望得到一些帮助。

亲切的问候。

答案1

这项任务更适合用正则表达式来完成。在这里我使用了正则表达式awk(因为我不熟悉rename命令和 perl 正则表达式,是的 - 真丢脸)。基本思想是,我们取文件名,去掉所有数字(假设您非常擅长保持自己的命名法,并且P-部分之后不会有数字)。
文件名以命令行参数的形式提供,可以逐个输入或与通配符一起使用,如我在此处所示。然后我们以交互方式从用户那里读入新数字,并将该新数字粘贴到每个裁剪的文件名中。

$ ls
16115P-barfoo.h  16115P-foobar.c  16115P-foobar.md  updateNames.sh*
$ ./updateNames.sh 16115*                                                                                                        
Enter new number for all specified files: 
17121
17121P-barfoo.h
17121P-foobar.c
17121P-foobar.md
$ cat updateNames.sh                                                                                                             
#!/bin/bash

if [ $# -eq 0  ]; 
then
    echo "<<< Error: no arguments provided"
    exit 1
fi

echo "Enter new number for all specified files: " 
read NEWNUMBER
for file in "$@";
do
  BASE="$(echo "$file" | awk -F '-' '{ gsub( /[[:digit:]]/,""); print }')"
  echo $NEWNUMBER""$BASE
  # uncomment this line for actual copying
  # cp "$file" $NEWNUMBER""$BASE
done

$ 

相关内容