我正在尝试创建一个 bash 脚本来实现以下任务:
- 读取二进制文件名。
- 检查输入的二进制文件名是否包含
A1
或B1
(不区分大小写)。 - 取决于识别的字符串是否包含
A1
copy todirA/
,否则如果包含B1
copy todirB/
。
我目前已经解决了任务 1 和 2,但希望获得有关任务 2 的一些指导。
答案1
将当前目录中A1
名称中包含该子字符串的所有文件复制到dirA
(假设存在的目录),然后以相同的方式将B1
名称中包含该子字符串的所有文件复制到:dirB
cp ./*A1* dirA/
cp ./*B1* dirB/
或者,用于--
将命令行选项与文件名操作数分隔开,
cp -- *A1* dirA/
cp -- *B1* dirB/
这将忽略具有隐藏名称(以点开头的名称)的文件。如果需要包含这些内容,请在运行命令之前设置dotglob
shell 选项。bash
shopt -s dotglob
解决更新的问题,该问题涉及一个脚本,该脚本在命令行上接收一个或多个文件名,并且需要根据文件名将它们移动到正确的目录。
您可以用来case ... esac
测试给定的字符串(文件名)是否与模式匹配,然后根据该测试的结果设置目标目录。在下面的代码中,如果两个模式都不匹配,我们还会输出一条警告消息:
#!/bin/sh
for filename do
case $filename in
*A1*) destdir=dirA ;;
*B1*) destdir=dirB ;;
*)
printf 'Can not sort "%s", skipping it\n' "$filename" >&2
continue
esac
cp -- "$filename" "$destdir"
done
再次假设目标目录存在。如果没有,您可能需要在cp
命令之前创建它们,使用mkdir -p -- "$destdir" || exit
.