bash脚本重命名多个文件

时间:2014-12-21 13:41:02

标签: bash shell

假设我有一堆文件名为:bsdsa120226.nai bdeqa140223.nai,我想将它们重命名为120226.nai 140223.nai。我如何使用下面的脚本实现这一目标?

#!/bin/bash
name1=`ls *nai*`
names=`ls *nai*| grep -Po '(?<=.{5}).+'`
for i in $name1
    do
    for y in $names
        do
            mv $i $y
        done
    done



Solution:
name1=`ls *nai*`

for i in $name1
do
y=$(echo "$i" | grep -Po '(?<=.{5}).+')
mv $i $y
done

4 个答案:

答案 0 :(得分:2)

此:

#!/bin/bash

shopt -s extglob nullglob
for file in *+([[:digit:]]).nai; do
    echo mv -nv -- "$file" "${file##+([^[:digit:]])}"
done

如果您对echo命令感到满意,请删除mv

注意。此解决方案 假设有5个要删除的主要字符。它将删除所有前导的非数字字符。

答案 1 :(得分:1)

只使用bash,你可以这样做:

for file in *nai* ; do
  echo mv -- "$file" "${file:5}"
done

(对输出感到满意时删除echo。)

Avoid ls in scripts,但显示信息除外。改为使用普通的globbing。

另请参阅How do I do string manipulations in bash?了解更多字符串操作技巧。


您的脚本无法使用该结构:如果您有5个文件,它将为第一个文件调用mv五次(对于第二个列表中的每个元素调用一次),对于第二,等等。您需要以锁步方式迭代这两组名称。 (它也不会处理文件名中的空格等内容。)

答案 2 :(得分:1)

最好在某些系统上使用renameprename),因为这样可以使用Perl正则表达式进行重命名,如下所示:

prename 's/^.{5}//' *.nai

脚本不正常的原因是,对于每个源文件,您尝试将其重命名为每个目标文件

如果您需要限制自己使用该脚本,则需要为每个源文件计算单个目标文件,如:

#!/bin/bash
for i in *.nai; do
    y=$(echo "$i" | cut -c6-)
    mv "$i" "$y"
done

答案 3 :(得分:0)

如果您的系统有rename工具,那么最好使用简单的rename命令,

rename 's/^.{5}//' *.nai

它只是从文件名中删除前5个字符。

for i in *.nai; do mv "$i" $(grep -oP '(?<=^.{5}).+' <<< "$i"); done