
我喜歡使用以下命令來列印檔案名,但它會列印帶有擴展名的檔案名稱。
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 '*.*'
: 有副檔名的檔名