我想更改存储在一系列文件列表中的文件的名称。 这是我正在使用的代码:
suffix=[event]
for i in {0..9} a b; do
for file in $(cat gsc"${i}".list); do
echo $file$suffix
done
done
输出很好,但是这个过程比我输出$file
慢得多。
也就是说,脚本运行正常,但为什么这么慢?
编辑:可能不清楚:我需要在文件列表(文本文件)中更改文件名。
答案 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
的值匹配的所有文件,后跟e
,v
,n
或t
。引用扩展应该通过避免尝试匹配模式来加快速度。 (请注意,如果 任何匹配的文件,您会得到非常不同的输出。)
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中的特定字符串可以用通用字符串替换,则可以对其进行改进(一般化)。如果不避免任务中的缓慢和混乱,我就无法做到。