bash中的明星通配符

时间:2018-05-22 10:47:05

标签: linux bash wildcard

我的bash脚本遇到了一个小问题。我尝试将当前目录中的文件名更改为txt扩展名为text扩展名的整个文件。例如1.txt1.text

我的脚本现在看起来像这样:

#!/bin/bash
FILES=`ls /home/name/*.txt`
NAME=*.txt
RENAME=*.text

for file in FILES
do 
mv $NAME $RENAME
done

我尝试使用单引号,双引号和反引号的整个组合,我一直都会收到错误。

您是否有一些想法如何接收通配符" *"在bash?

感谢。

3 个答案:

答案 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)

  1. 您可以使用重命名重命名文件名。

    rename .txt .text /home/name/*.txt
    
  2. 如果你想通过循环来做到这一点,你可以

    for FILE in /data/tmp/*.txt; do
        mv  "${FILE}" "${FILE/.txt/.text}"
    done