2012-07-10 59 views
4

我跑了從基礎文件夾./力sort命令忽略文件夾名稱

find . -name *.xvi.txt | sort 

它返回以下排序順序如下:

./LT/filename.2004167.xvi.txt 
./LT/filename.2004247.xvi.txt 
./pred/2004186/filename.2004186.xvi.txt 
./pred/2004202/filename.2004202.xvi.txt 
./pred/2004222/filename.2004222.xvi.txt 

正如你可以看到,文件名遵循規則的結構,但是文件本身可能位於目錄結構的不同部分。有沒有辦法忽略文件​​夾名稱和/或目錄結構,以便排序僅基於文件名本身返回文件夾/文件名列表?像這樣:

./LT/filename.2004167.xvi.txt 
./pred/2004186/filename.2004186.xvi.txt 
./pred/2004202/filename.2004202.xvi.txt 
./pred/2004222/filename.2004222.xvi.txt 
./LT/filename.2004247.xvi.txt 

我已經嘗試了幾個不同的開關,查找和排序命令下,但沒有運氣。我總是可以將所有內容複製到一個文件夾並從那裏進行排序,但有幾百個文件,我希望能有更優雅的選項。

謝謝!感謝您的幫助。

+1

確保你把周圍的參數報價爲'-name'。否則,如果您有任何基礎目錄中擴展名爲「xvi.txt」的文件,這將停止工作。 – 2012-07-10 14:12:21

+0

我沒有意識到我有一個壞習慣。乾杯! – Prophet60091 2012-07-10 14:45:59

回答

0
find . -name *.xvi.txt | sort -t'.' -k3 -n 

將按照您的要求進行排序。唯一的問題是如果文件名或目錄名稱包含附加點。

爲了避免它,你可以使用:

find . -name *.xvi.txt | sed 's/[0-9]\+.xvi.txt$/\\&/' | sort -t'\' -k2 | sed 's/\\//' 
+0

這是直接爲我開箱的唯一答案。 所以,如果我正在閱讀這個權利,那麼排序命令會根據選定的定界符(-t'。')來分割列表。然後它使用第三列(-k3)中的信息,即數字值(例如2004186)去掉,然後用數字排序(-n)?不過,我明白你的意思。 – Prophet60091 2012-07-10 14:57:06

+0

@ Prophet60091你是對的。 'sed'的方式不應該有這樣的問題。 – rush 2012-07-10 15:06:48

5

如果您的find-printf您可以打印基本文件名和完整的文件名。按第一個字段排序,然後剝離。

find . -name '*.xvi.txt' -printf '%f %p\n' | sort -k1,1 | cut -f 2- -d ' ' 

我選擇了一個空格作爲分隔符。如果您的文件名包含空格,則應該選擇另一個分隔符,該分隔符是不在文件名中的一個字符。如果任何文件名包含換行符,則必須修改它,因爲它不起作用。

請注意,應該引用find命令中的glob。

1

如果您find沒有printf,你可以使用awk來完成同樣的事情:

find . -name *.xvi.txt | awk -F/'{ print $NF, $0 }' | sort | sed 's/.* //' 

同樣的警告有關丹尼斯·威廉姆森提到的適用於此處的空間。而對於多樣性,我使用sed來剝離排序字段,而不是cut