从使用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按字母顺序排序的目录中获取文件的主要内容,如果未能解决你的问题,请参考以下文章