所以我完全按照教程告诉我的方式做这件事,但有些东西仍然不起作用......
1 #!/bin/bash
2 users=$(ls *.usr)
3 date=$(date +%F)
4 for usr in $users
5 do
6 mv ${usr} ${date}-${users}
7 done
这些是该目录的内容:
1.sh fila2 fila6 file3 log1 marty1.usr marty5.usr marty9.usr user3
2.sh fila3 file0 file4 marty0.usr marty2.usr marty6.usr user0 user4
fila0 fila4 file1 file5 marty10.usr marty3.usr marty7.usr user1 user5
fila1 fila5 file2 file6 marty11.usr marty4.usr marty8.usr user2 user6
现在显然,我的脚本应该重命名所有以 .usr 结尾的文件,使其名称前面包含日期,但相反,我收到此错误:
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
再说一次,我不知道我做错了什么,考虑到我什至没有在任何地方要求它创建一个名为 marty9.usr 的文件夹......
答案1
这就是你的教程应该告诉你:
#!/bin/bash
date=$(date +%F)
for file in *.usr
do
echo moving "$file" to "$date-$file"
mv "$file" "$date-$file"
done
在哪里
- 你不用来
ls
迭代文件名 - 您直接迭代与模式匹配的文件
- 您引用变量是为了保护自己免受分词和文件名扩展的影响。
答案2
所以显然我错了
6 mv ${usr} ${date}-${users}
本来应该是
6 mv ${usr} ${date}-${usr}
但我仍然不明白为什么这会起作用。我没有告诉脚本 usr 是什么地方...当我没有告诉它时,它怎么知道 usr 是文件名? “for usr in $users”对我来说没有意义......
那么无论我如何称呼 usr 和 $usr ,这都会起作用吗?如果我把它称为“香蕉”和“$香蕉”,会有效吗?
是的,即使我称其为香蕉,它也能起作用...为什么?那么第一个任期的目的是什么?
老实说,这不是一个关于 shell 脚本的教程,而是一个关于 Linux 的一般教程,它只是有一些关于 shell 脚本的内容:)