我一直在使用一个放在我的用户/.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
$