从使用bash按字母顺序排序的目录中获取文件

Posted

技术标签:

【中文标题】从使用bash按字母顺序排序的目录中获取文件【英文标题】:Get files from directories alphabetically sorted with bash 【发布时间】:2021-08-20 12:25:09 【问题描述】:

我有这段代码可以在我执行的目录中运行:

pathtrabajo=.
filedirs="files.txt"
dirs=$(find . -maxdepth 1 -mindepth 1 -type d | sort -n)
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for entry in $dirs
do
    echo "$entry" >> "$filedirs"
    find "$entry" -maxdepth 1 -mindepth 1 -name '*.md' -printf '%f\n' | sort | sed 's/\.md$//1' | awk 'print "- [["$0"]]"' >> "$filedirs"    
done
IFS=$SAVEIFS

但是当我尝试使其全局使用变量时,find 给出错误:

pathtrabajo="/path/to/a/files"
filedirs="files.txt"
dirs=$(find "$pathtrabajo" -maxdepth 1 -mindepth 1 -type d | sort -n)
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for entry in "$dirs[@]"
do
    echo "$entry" >> "$pathtrabajo"/"$filedirs"
    find "$entry" -maxdepth 1 -mindepth 1 -name '*.md' -printf '%f\n' | sort | sed 's/\.md$//1' | awk 'print "- [["$0"]]"' >> "$pathtrabajo"/"$filedirs"    
done
IFS=$SAVEIFS

我做错了什么?

【问题讨论】:

尝试使用启用调试标志的代码运行。 bash -x .... 你为什么临时将 IFS 分配给“\n\b”? 这样$dirs [@]中的变量用换行符分隔 但那是IFS=$'\n'; \b 是干什么用的? 【参考方案1】:

真的不清楚你为什么在这里使用find。如果我可以从您的代码中猜到,以下将可能执行您正在尝试的操作。

dirs=([0-9][!0-9]*/ [0-9][0-9][!0-9]*/ [0-9][0-9][0-9][!0-9]*/ [!0-9]*/)
printf "%s\n" "$dirs[@]" >"$filedirs"
for dir in "$dirs[@]"; do
    printf "%s\n" "$dir"/*.md |
    awk ' sub(/\.md$/, ""); print "- [["$0"]]" '
done >>"$filedirs"

shell 已经按字母顺序扩展了通配符。 dirs 分配将扩展所有以单个数字开头的目录,然后是具有两位数字的目录,然后是具有三个数字的目录——如果需要更多数字,则扩展——然后是不以数字开头的目录。

扩展代码以在任意目录中运行并不难,但很麻烦。我建议的解决方案是(一次!)cd 到您想要列表的目录,然后运行此脚本。

【讨论】:

以上是关于从使用bash按字母顺序排序的目录中获取文件的主要内容,如果未能解决你的问题,请参考以下文章

C++ 按字母顺序排序字符串

按子文件夹编号对目录列表进行排序

c ++文件系统,按字母顺序获取目录中的文件,重命名输入

如何先按搜索词排序查询结果,然后按字母顺序?

如何在R中按字母顺序排序?

为啥“HTML 文件选择”会更改所选文件的顺序并按字母顺序排序?