gpt4 book ai didi

linux - 从各种目录中随机选择一个文件并排序

转载 作者:可可西里 更新时间:2023-11-01 11:46:00 24 4
gpt4 key购买 nike

我有很多文本文件分布在几个目录中。我想对所有文件进行排序并创建一个文件名列表(在文本文件中),但要按照一种特殊的定义顺序。我最初的想法是从这些目录中随机选择第一个文件 *1.txt。然后重复该过程(*2.txt、*3.txt 等)直到所有文件名都在列表中。我如何在 bash 中完成此操作?

基础知识:

从1个目录中随机选择文件:

shuf -n1 –e *

从 1 个目录中选择第一个文件:

ls | sort -n | head -1

示例:

更新:文件结构/真实文件名格式(这只是几个文件,有几百个)

初始订单:

media/sf_linux_sandbox/papers/
|-- semester_1
| |-- cs630-linux_research_paper-fname_lname-001.txt
| |-- cs635-progamming_languages-fname_lname-002.txt
| |-- cs645-java_programming_paper-fname_lname-003.txt
| `-- cs900-computer_robotics_capstone-fname_lname-004.txt
|-- semester_2
| |-- cs650-software_methodologies-fname_lname-001.txt
| |-- cs675-nosql_db_research-fname_lname-002.txt
| |-- cs700-artificial_intelligence_reasearch-fname_lname-003.txt
| |-- cs800-algorithms_and_computational_complexity-fname_lname-004.txt
| |-- cs825-database_systems_internals-fname_lname-005.txt
| `-- cs850-computer_graphics-fname_lname-006.txt
|-- semester_3
|-- cs725-web_programming_technologies-fname_lname-001.txt
|-- cs750-data_programming-fname_lname-002.txt
`-- cs775-hardware_software_interface_paper-fname_lname-003.txt

我希望生成的输出/结果(随机打乱文件但保持数字顺序):

results.txt
/filepath/cs650-software_methodologies-fname_lname-001.txt
/filepath/s630-linux_research_paper-fname_lname-001.txt
/filepath/cs725-web_programming_technologies-fname_lname-001.txt
/filepath/cs635-progamming_languages-fname_lname-002.txt
/filepath/cs750-data_programming-fname_lname-002.txt
/filepath/cs675-nosql_db_research-fname_lname-002.txt
/filepath/cs645-java_programming_paper-fname_lname-003.txt
/filepath/cs775-hardware_software_interface_paper-fname_lname-003.txt
/filepath/cs700-artificial_intelligence_reasearch-fname_lname-003.txt
/filepath/cs900-computer_robotics_capstone-fname_lname-004.txt
/filepath/cs800-algorithms_and_computational_complexity-fname_lname-004.txt
/filepath/cs825-database_systems_internals-fname_lname-005.txt
/filepath/cs850-computer_graphics-fname_lname-006.txt

最佳答案

这会打乱源代码树中的所有文件,以稳定的排序对数字部分进行部分排序,因此其他元素保持打乱。

$ target=~/tmp/shuf
$ destination=/filepath/
$ tree $target
~/tmp/shuf
`-- papers
|-- semester_1
| |-- cs630-linux_research_paper-fname_lname-001.txt
| |-- cs635-progamming_languages-fname_lname-002.txt
| |-- cs645-java_programming_paper-fname_lname-003.txt
| `-- cs900-computer_robotics_capstone-fname_lname-004.txt
|-- semester_2
| |-- cs650-software_methodologies-fname_lname-001.txt
| |-- cs675-nosql_db_research-fname_lname-002.txt
| |-- cs700-artificial_intelligence_reasearch-fname_lname-003.txt
| |-- cs800-algorithms_and_computational_complexity-fname_lname-004.txt
| |-- cs825-database_systems_internals-fname_lname-005.txt
| `-- cs850-computer_graphics-fname_lname-006.txt
`-- semester_3
|-- cs725-web_programming_technologies-fname_lname-001.txt
|-- cs750-data_programming-fname_lname-002.txt
`-- cs775-hardware_software_interface_paper-fname_lname-003.txt

4 directories, 13 files
$ find $target -type f -iname "*.txt" \
| shuf \
| awk -F- '{printf("%s:%s\n", $0, $NF)}' \
| sort -t : -k 2 -s \
| cut -d : -f 1 \
| xargs -n1 basename \
| sed "s,^,$destination,"
/filepath/cs725-web_programming_technologies-fname_lname-001.txt
/filepath/cs650-software_methodologies-fname_lname-001.txt
/filepath/cs630-linux_research_paper-fname_lname-001.txt
/filepath/cs635-progamming_languages-fname_lname-002.txt
/filepath/cs750-data_programming-fname_lname-002.txt
/filepath/cs675-nosql_db_research-fname_lname-002.txt
/filepath/cs775-hardware_software_interface_paper-fname_lname-003.txt
/filepath/cs700-artificial_intelligence_reasearch-fname_lname-003.txt
/filepath/cs645-java_programming_paper-fname_lname-003.txt
/filepath/cs900-computer_robotics_capstone-fname_lname-004.txt
/filepath/cs800-algorithms_and_computational_complexity-fname_lname-004.txt
/filepath/cs825-database_systems_internals-fname_lname-005.txt
/filepath/cs850-computer_graphics-fname_lname-006.txt

要将结果存储在名为 filename 的文件中,您可以重定向:

$ find $target -type f -iname "*.txt" \
| shuf \
| awk -F- '{printf("%s:%s\n", $0, $NF)}' \
| sort -t : -k 2 -s \
| cut -d : -f 1 \
| xargs -n1 basename \
| sed "s,^,$destination," \
> filename

关于linux - 从各种目录中随机选择一个文件并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26396185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com