bash:按文件内部的数字对文件进行排序

bash:按文件内部的数字对文件进行排序

我需要生成 100 个 .txt 文件,每个文件内都有一个随机数。然后我需要重命名这些文件,以便根据每个文件中存储的值按升序将文件名从 1.txt 命名为 100.txt。名为 1.txt 的文件应存储最小的数字,名为 100.txt 的文件应存储最大的数字

我尝试了这个代码:

#!/bin/bash
for i in $(seq 1 100)
do
echo $RANDOM > ${i}.txt
done
cat *.txt | sort

答案1

创建一个新目录,并将该目录命名为您选择的任意名称。将目录更改为cd您创建的新目录,这样 shell 脚本创建的所有文件都将在新目录中创建,并且只有这些新创建的文件会被重命名。然后运行以下 shell 脚本。

#!/bin/bash
for i in $(seq 1 100)
do
echo $RANDOM > ${i}.txt # Put a random number inside each file.
mv ${i}.txt $(head -1 ${i}.txt).txt # Rename the files.
done
ls *.txt | sort -n # Sort the files in ascending order.

您的问题含糊不清,因为我也可以按升序重命名文件,新名称范围从 1.txt 到 100.txt。如果您希望文件重命名的方式是那样,请使用此 shell 脚本。

#!/bin/bash
for i in $(seq 1 100)
do
echo $RANDOM > ${i}.txt # put a random number inside each file
mv ${i}.txt $(head -1 ${i}.txt).txt # rename files
done
# ls *.txt | sort -n # I commented out this line and added a new line after it.
i=1; for filename in `ls *.txt | sort -n`; do mv "$filename" "$((i++)).txt"; done

答案2

您可以先生成所有随机数,然后对它们进行排序,然后再将它们写入文件:

for i in {1..100}; do
    echo $RANDOM
done \
| sort -n \
| while read n; do
     (( x+=1 ))
     echo "$n" > "$x.txt"
  done

或者与单行相同:

for i in {1..100}; do echo $RANDOM; done | sort -n | while read n; do (( x+=1 )); echo "$n" > "$x.txt"; done

还要注意,要按sort数字顺序对数字字符串进行排序,您需要它的--numeric-sort(或-n)选项。

相关内容