编写Bash脚本:按文件名字符数筛选并复制文件至指定目录
解决Bash脚本复制指定文件名长度文件的问题
我来帮你搞定这个脚本!你的思路方向是对的,但几个关键细节没处理好,导致没法完成文件复制。先看看原脚本的问题:
原脚本的错误点
- 参数获取方式不符合需求:你用
read number手动输入长度,但需求是通过脚本参数传入,应该用位置参数$1,这样运行脚本时直接用./yourscript.sh 5就能指定长度,更符合脚本的使用习惯。 - 丢失文件名与长度的关联:你收集的
list变量只存了每个文件名的字符数,没有把长度和对应的文件名绑定,后面的循环遍历的是一串数字,根本不知道哪个数字对应哪个文件,自然没法复制。 - 变量引用错误:最后
cp file dir2里的file是字面字符串,不是变量;就算改成$file,这里的$file也是长度数字,不是实际文件名,完全不对。
修正后的脚本
这是一个更健壮、符合需求的版本:
#!/bin/bash # 检查是否传入了正确的参数数量 if [ $# -ne 1 ]; then echo "请传入一个整数作为文件名长度参数!" echo "用法: $0 <文件名长度>" exit 1 fi target_length="$1" # 确保目标目录dir2存在,不存在则自动创建 mkdir -p dir2 # 遍历当前目录下的所有条目 for file in *; do # 只处理普通文件(如果需要包含目录,可以去掉这个判断) if [ -f "$file" ]; then # 用Bash内置方法获取文件名的字符数,高效且准确 file_length=${#file} # 比较长度是否匹配 if [ "$file_length" -eq "$target_length" ]; then echo "正在复制: $file → dir2/" cp "$file" dir2/ fi fi done
脚本说明
- 参数校验:先检查用户是否传入了参数,如果没传或者传多了,会给出清晰的用法提示,避免无效运行。
- 目录保障:用
mkdir -p dir2确保目标目录存在,避免因为目录不存在导致复制失败。 - 高效获取长度:用Bash内置的
${#file}获取文件名长度,比wc -m更高效,还不会因为echo的换行符导致长度多算1的问题。 - 空格兼容:所有变量都加了双引号,就算文件名包含空格或特殊字符(比如
my file.txt)也能正常处理。 - 文件过滤:加入
-f判断,只复制普通文件,跳过目录(如果需要复制目录,删掉这个判断即可)。
运行方式
给脚本加执行权限:
chmod +x copy_by_length.sh
然后运行,比如要复制文件名长度为5的文件:
./copy_by_length.sh 5
内容的提问来源于stack exchange,提问作者David Trpcevski
相关产品推荐
相关产品推荐

