如何在for循环中使用grep

时间:2014-04-02 16:58:50

标签: bash unix

有人可以请帮助这个脚本。我需要使用grep循环遍历需要更改的文件名。

#!/bin/bash

file=

for file in  $(ls $1)

do

grep "^.old" |  mv  "$1/$file"  "$1/$file.old"

done

2 个答案:

答案 0 :(得分:2)

bash可以在不使用grep的情况下处理正则表达式。

for f in "$1"/*; do
    [[ $f =~ \.old ]] && continue
    # Or a pattern instead
    # [[ $f == *.old* ]] && continue
    mv "$f" "$f.old"
done

您还可以将名称检查移动到模式中:

shopt -s extglob
for f in "$1/"!(*.old*); do
    mv "$f" "$f.old"
done

答案 1 :(得分:0)

如果我理解你的问题,你只想重命名一个文件(即 dir / file.txt ==> dir / file.old )该文件之前尚未重命名。解决方案如下。

#!/bin/bash

for file in "$1/"*
do
    backup_file="${file%.*}.old"
    if [ ! -e "$backup_file" ]
    then
        echo mv "$file" "$backup_file"
    fi
done

讨论

脚本当前没有实际备份,它只显示操作。运行一次脚本并检查输出。如果这是您想要的,请从脚本中删除echo并再次运行。

更新

以下是 no if 解决方案:

ls "$1/"* | grep -v ".old" | while read file
do
    echo mv "$file" "${file}.old"
done

讨论

  • ls命令显示所有文件。
  • grep命令会过滤掉那些.old扩展名的文件,以便不显示这些文件。
  • while循环逐个读取没有.old扩展名的文件名并重命名。