更改文件列表中的文件名:慢脚本

时间:2014-01-30 05:32:25

标签: bash shell echo cat

我想更改存储在一系列文件列表中的文件的名称。 这是我正在使用的代码:

suffix=[event]

for i in {0..9} a b; do
    for file in $(cat gsc"${i}".list); do
        echo $file$suffix
    done
done

输出很好,但是这个过程比我输出$file慢得多。 也就是说,脚本运行正常,但为什么这么慢?

编辑:可能不清楚:我需要在文件列表(文本文件)中更改文件名。

4 个答案:

答案 0 :(得分:2)

这个怎么样:

suffix=[event]
cat gsc[0-9ab].list|sed "s/$/$suffix/"

如果您需要更改gsc * .list文件中列出的文件名,请尝试:

suffix=[event]
cat gsc[0-9ab].list |while read file
do
  mv "${file}" ${file}$suffix
done 

答案 1 :(得分:1)

如果列表很大,不必要地在反引号中扩展它们可能会减慢你的速度,并且additional problems。试试这个:

suffix='[event]'

for i in {0..9} a b; do
    while read file; do
        echo $file$suffix
    done <gsc"${i}".list
done

答案 2 :(得分:1)

[event]是一个shell模式。当您展开$file$suffix时,您的shell会尝试匹配当前目录中名称与$file的值匹配的所有文件,后跟evnt。引用扩展应该通过避免尝试匹配模式来加快速度。 (请注意,如果 任何匹配的文件,您会得到非常不同的输出。)

suffix=[event]

for i in {0..9} a b; do
    for file in $(cat gsc"${i}".list); do
        echo "$file$suffix"
    done
done

正如其他人所提到的,循环写得更好

for i in {0..9} a b; do
    while read file; do
        echo "$file$suffix"
    done < gsc"$i".list
done

或完全替换为tripleee的sed命令

sed "s|.*|mv '&' '&[event]'|" gsc[0-9ab].list | sh

答案 3 :(得分:0)

超快且完整:

for i in {0..9} a b; do
    sed -i.bak "s|evt|evt[events]|g" gsc"${i}".list
done

如果sed中的特定字符串可以用通用字符串替换,则可以对其进行改进(一般化)。如果不避免任务中的缓慢和混乱,我就无法做到。