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

Bash 更改文件列表中的文件名:慢速脚本,bash,shell,echo,cat,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慢得多。 也就是说,脚本工作得很好,但为什么这么慢 编辑:可能不清楚:我需要更改文件列表(文本文件)中的文件名。如何: suffix=[event]

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

suffix=[event]

for i in {0..9} a b; do
    for file in $(cat gsc"${i}".list); do
        echo $file$suffix
    done
done
输出很好,但过程比仅输出
$file
慢得多。 也就是说,脚本工作得很好,但为什么这么慢

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

如何:

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 
这个怎么样:

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 

如果列表很大,不必要地在背景中扩展它们可能会使您的速度变慢,并且可能会出现问题。请尝试以下方法:

suffix='[event]'

for i in {0..9} a b; do
    while read file; do
        echo $file$suffix
    done <gsc"${i}".list
done
suffix='[event]'
对于{0..9}ab中的i;做
读取文件时;做
echo$file$后缀

完成如果列表很大,不必要地在背景中扩展它们可能会使您的速度变慢,并且可能会出现问题。请尝试以下方法:

suffix='[event]'

for i in {0..9} a b; do
    while read file; do
        echo $file$suffix
    done <gsc"${i}".list
done
suffix='[event]'
对于{0..9}ab中的i;做
读取文件时;做
echo$file$后缀

done
[event]
是一种shell模式。当您展开
$file$suffix
时,shell将尝试匹配当前目录中名称与
$file
值匹配的任何文件,后跟
e
v
n
t
。引用扩展应该会加快速度,避免尝试匹配模式。(请注意,如果存在任何匹配的文件,您将获得非常不同的输出。)

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

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

[event]
是一种shell模式。当您展开
$file$suffix
时,shell将尝试匹配当前目录中名称与
$file
值匹配的任何文件,后跟
e
v
n
t
。引用扩展应该会加快速度,避免尝试匹配模式。(请注意,如果存在任何匹配的文件,您将获得非常不同的输出。)

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

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

超快速和完整:

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

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

超快速完成:

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

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

是什么让你认为
echo
ing一个额外的变量会使脚本明显变慢?我不认为,这是事实。我不知道原因,这就是我要问的。是什么让你认为
echo
ing一个额外的变量会使脚本明显变慢?我不认为,这是事实。我不知道原因,这就是我要问的。仍然很慢,但是非常感谢你的解释和链接。仍然很慢,但是非常感谢你的解释和链接。或者你可以
sed“s |。*mv'&“&[event]”gsc[0-9ab]。list | sh
@BMW:我实际上不知道如何更改列表中的文件名,或者你可以
sed“s |.*.|mv'&''&[event]'|“gsc[0-9ab].list | sh
@BMW:我实际上不知道如何更改列表中的文件名谢谢chepner。请您花几句话说明sed在这种情况下的作用。这样我就可以随心所欲地操作它了。管道字符用于分隔搜索文本(
*
,基本上是所有内容)从替换文本(
mv'&''&[event]',将
&`替换为匹配的搜索文本)。它为其中一个输入文件中的每一行创建一个有效的
mv
命令。例如,如果
sed
读取“xyz”,它将输出一行
mv'xyz''xyz[event]
。单引号确保在由
sh
解析命令时正确引用参数。谢谢chepner。请您花几句话说明sed在这种情况下的作用。这样我就可以随心所欲地操作它。管道字符用于分隔搜索文本(
*
,基本上是所有内容)从替换文本(
mv'&''&[event]',将
&`替换为匹配的搜索文本)。它为其中一个输入文件中的每一行创建一个有效的
mv
命令。例如,如果
sed
读取“xyz”,它将输出一行
mv'xyz''xyz[event]
。单引号确保在由
sh
解析命令时正确引用参数。