簡體   English   中英

查找的 Bash 排序順序 - 同名目錄之前的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM