Bash
查找與目錄同名的文件
我有下一個問題:
目錄
Example1
包含三個文件Example1
:Things
和Pictures
。目錄
Example2
包含三個文件Example2
:Example3
和Pictures
。我需要一個僅顯示與目錄名稱匹配的文件的列表,即:
Example1
和Example2
. 我嘗試過使用 diff、find、locate 和 ls ……但我沒有取得任何成就。
由於目錄通常比文件少,讓我們查找所有目錄,然後測試它們是否包含所需的文件名。
find . -type d -exec sh -c ' for dirpath do filepath="$dirpath/${dirpath##*/}" [ -f "$filepath" ] && printf "%s\n" "$filepath" done' sh {} +
這將列印位於與文件同名的目錄中的所有正常文件(以及到正常文件的符號連結)的路徑名。
測試是在一個簡短的內嵌
sh -c
腳本中完成的,該腳本將獲取許多目錄路徑名作為參數。它遍歷每個目錄路徑名並使用我們正在尋找的名稱構造一個文件路徑名。程式碼中的${dirpath##*/}
可以替換為$(basename "$dirpath")
。對於給定的範例目錄結構,這將輸出
./Example1/Example1 ./Example2/Example2
要測試任何名稱,而不僅僅是正常文件,請將測試更改
-f
為-e
測試。
您可以使用反向引用輕鬆地將與包含目錄同名的文件名與正則表達式匹配。
what/ever/something/something
這些是兩something
部分相同且不包含斜杠的形式的文件名。在 BRE 正則表達式語法中,[^/]*
匹配任何不包含斜杠的字元串,\(/[^/]*\)
匹配斜杠後跟任意數量的非斜杠字元並將整個事物組成一個組,並\1
匹配與第一個組匹配的相同文本,因此\(/[^/]*\)\1
匹配兩個同名的路徑段。在開頭添加.*
以匹配之前的目錄組件。使用 GNU find、FreeBSD find、macOS find 或任何其他
find
支持-regex
:find . -regex '.*\(/[^/]*\)\1'