我的bash脚本遇到了一个小问题。我尝试将当前目录中的文件名更改为txt
扩展名为text
扩展名的整个文件。例如1.txt
到1.text
我的脚本现在看起来像这样:
#!/bin/bash
FILES=`ls /home/name/*.txt`
NAME=*.txt
RENAME=*.text
for file in FILES
do
mv $NAME $RENAME
done
我尝试使用单引号,双引号和反引号的整个组合,我一直都会收到错误。
您是否有一些想法如何接收通配符" *"在bash?
感谢。
答案 0 :(得分:0)
这根本不是你怎么做的。
#!/bin/bash
shopt -s nullglob
OLD=.txt
NEW=.text
FILES=(/home/name/*"$OLD")
for file in "${FILES[@]}"
do
mv "$file" "${file%$OLD}$NEW}"
done
答案 1 :(得分:0)
您的脚本存在许多问题。首先,你不应该运行ls
并尝试存储它的输出。如果你想迭代这些文件,只需在循环中执行:
for file in /home/name/*.txt
现在shell正在为您完成所有工作,并作为处理您可能拥有的任何奇怪文件名的奖励。
在你的例子中,你循环遍历文字字符串" FILES"而不是变量,但我想这只是一个错字。
更改文件名的内置方法是使用参数扩展删除旧文件,然后连接新文件:
old=txt
new=text
for file in /home/name/*"$old"
do
mv "$file" "${file%$old}$new"
done
如果可能没有与glob匹配的文件,那么默认情况下,/home/name/*.txt
将不会展开,您的循环将只运行一次。那么你有几个选择:
shopt -s nullglob
以便/home/name/*.txt
扩展为null,并跳过循环在循环中添加显式检查,以确保$file
存在,然后才尝试mv
:
for file in /home/name/*"$old"
do
[ -e "$file" ] || continue
mv "$file" "${file%$old}$new"
done
答案 2 :(得分:-1)
您可以使用重命名重命名文件名。
rename .txt .text /home/name/*.txt
如果你想通过循环来做到这一点,你可以
for FILE in /data/tmp/*.txt; do
mv "${FILE}" "${FILE/.txt/.text}"
done