[英]Bash sort order of find - files before directory with same name
假設我們有一個如下所示的目錄:
.
├── 1
│ ├── 1_1.md
│ └── 1_2.md
├── 1.md
├── 2
│ ├── 2_1.md
│ └── 2_2.md
└── 2.md
這可以通過以下方式重新創建:
mkdir example
cd example
echo "# Chapter 1" >> 1.md
mkdir 1
cd 1
echo "## Section 1.1" >> 1_1.md
echo "## Section 1.2" >> 1_2.md
cd ..
echo "# Chapter 2" >> 2.md
mkdir 2
cd 2
echo "## Section 2.1" >> 2_1.md
echo "## Section 2.2" >> 2_2.md
現在我想按以下順序將所有.md
文件連接成一個.md
文件:
- 1.md
- 1_1.md
- 1_2.md
- 2.md
- 2_1.md
- 2_2.md
很遺憾,
$ cat `find -type f | sort`
給我
## Section 1.1
## Section 1.2
# Chapter 1
## Section 2.1
## Section 2.2
# Chapter 2
其中章節與章節的順序混合為
$ find -type f | sort
給我
./1/1_1.md
./1/1_2.md
./1.md
./2/2_1.md
./2/2_2.md
./2.md
如何強制在相應部分上方的章節?
我會這樣做:
cd example
cat $(ls -1v *.md */*.md)
如果您的sort
命令支持-V
選項...
-V, --version-sort
natural sort of (version) numbers within text
...我們可以使用它根據需要對文件名進行排序:
$ find -type f | sort -V
./1.md
./1/1_1.md
./1/1_2.md
./2.md
./2/2_1.md
./2/2_2.md
現在將結果通過管道傳輸到xargs/cat
以按所需順序顯示字符串:
$ find -type f | sort -V | xargs -r cat
# Chapter 1
## Section 1.1
## Section 1.2
# Chapter 2
## Section 2.1
## Section 2.2
由於示例文件名的結構,您可以這樣做:
find -type f -printf "%f\t%p\n" |
sort -t_ -n -k1 -k2 |
cut -f2- |
xargs cat
首先用制表符分隔的路徑打印文件名。 然后用_
作為分隔符進行數字排序,然后在第二個字段(即章節和節)上。 然后刪除文件名,留下路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.