linux find 指令尋找不含副檔名的未知副檔名的檔名

linux find 指令尋找不含副檔名的未知副檔名的檔名

我喜歡使用以下命令來列印檔案名,但它會列印帶有擴展名的檔案名稱。

find . -type f -printf '%f\n'

在我的目錄中,有許多具有不同副檔名的檔案。我嘗試添加--ignore='*.*'before 和 after -printf,但沒有成功。例子;我有檔案 myfile1.txt、myfile2.mp3 等。

答案1

如果我理解正確的話(我沒有,請參閱答案的第二部分),您希望避免列出包含點字元的檔案名稱。

這將做到這一點:

find . -type f ! -name '*.*'

檔案名稱通配模式*.*將符合任何包含至少一個點的檔案名稱。前面的內容!否定了匹配的意義,這意味著到達末尾的路徑名將是名稱中沒有點的檔案的路徑名。在真的很古老shell,您可能想要轉義!as \!(或更新您的 Unix 安裝)。孤獨者!不會召喚bash的歷史擴展設施

使用 GNU 僅列印找到的路徑名的檔名部分find

find . -type f ! -name '*.*' -printf '%f\n'

對於標準find(或 GNU find):

find . -type f ! -name '*.*' -exec basename {} \;

在循環中的命令替換中使用它之前,請參閱“為什麼循環查找的輸出是不好的做法?」。


要列出所有檔案名,同時刪除名稱中最後一個點之後的所有內容(「刪除副檔名」),您可以使用

find . -type f -exec sh -c '
    for pathname do
        pathname=$( basename "$pathname" )
        printf "%s\n" "${pathname%.*}"
    done' sh {} +

這會將所有檔案的所有找到的路徑名稱傳送到一個短 shell 循環。該循環將取得每個路徑名並呼叫basename它來提取路徑名的檔案名稱部分,然後列印結果字串,其中刪除最後一個點後的所有內容。

參數擴展的意思是「從值的末尾${pathname%.*}刪除最短的字串匹配(一個文字點後跟任意文字) 」。它將具有刪除檔案名稱中最後一個點之後的檔案名稱後綴的效果。.*$pathname

欲了解更多信息find ... -exec ... {} +,請參閱“了解“find”的 -exec 選項」。

答案2

在 Linux 中,不存在檔案副檔名之類的東西。檔案名稱中的A.沒有任何意義(儘管 a.作為第一的檔案名稱中的字元將其標識為隱藏檔案)。

另外,檢查我的系統上的手冊頁find沒有顯示--ignore任何選項。

也就是說,如果您想忽略.名稱中帶有 a 的任何文件,可以使用find's-not運算子:

find -type f -not -name '*.*' -print

答案3

正如其他人所指出的,「擴展」對於 Unix 系統來說沒有任何意義。但我們可以使用一個簡單的命令將它們從清單中刪除sed

例如

find * -type f -print | sed 's/\.[^.]*$//'

如果有目錄並且您不希望它們顯示在列表中,那麼

find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'

對於單一目錄,我們可以使用ls而不是find

ls | sed 's/\.[^.]*$//'

答案4

嘗試

find . -type f \! -name '*.*' -print

在哪裡

  • \!: 不是(!必須轉義)
  • name '*.*': 有副檔名的檔名

相關內容