Filenames

如何在不顯示“/”的情況下查找文件

  • February 8, 2022

我是初學者,我不知道腳本 shell Linux 的語法。

我必須只顯示已經完成的以 (.sh) 結尾的文件。

但是當我使用 cut 時,這些以 (.sh) 結尾的文件的名稱必須不顯示“.sh”和“./”

我拿走了兩點之間的一切

範例:./hello.sh

輸出:/你好

所以斜線仍然存在,我沒有找到任何解決方案 例子

像這樣使用 find/cut 會破壞子目錄中的任何文件。在目前目錄中,嘗試ls | cut -d"." -f1,或者如果有子目錄,嘗試find * -name "*.sh" | sed "s/.sh$//"

有了新的查找,它*會擴展到目前目錄中的所有條目,所以它可能是(例如find file1.sh dir1 dir2 -name "*.sh"。通過 sed 的管道,只是去掉了結尾。

假設您要顯示與*.sh目前目錄中的模式匹配的名稱,不帶.sh後綴:

for name in ./*.sh; do
   basename "$name" .sh
done

basename實用程序輸出作為第一個參數給出的路徑名的文件名部分,如果給出第二個參數,則從名稱的末尾剝離該字元串。上述循環不考慮隱藏名稱。

如果您需要遞歸地執行此操作,那麼您可以find像這樣使用:

find . -name '*.sh' -exec basename {} .sh \;

這會呼叫basename每個找到的路徑名並sh從每個路徑名中刪除文件名後綴。

如果您使用的是bashshell,您也可以這樣做:

shopt -s nullglob dotglob
shopt -s globstar

for name in ./**/*.sh; do
   basename "$name" .sh
done

這設置了一些 shell 選項,以便能夠找到隱藏的名稱 ( ),如果沒有匹配項 ( ),則完全dotglob避免循環,並且能夠使用通配模式 ( ; 匹配“遞歸”)。nullglob``**``globstar

使用zsh外殼,您將獲得類似的效果

print -rC1 -- ./**/*.sh(DN:r:t)

… where the Dand Nin the globbing qualifier at the globbing pattern end of the globbing qualifiers in the globbing pattern end has the same effect as dotgloband nullglobin the bashshell, and where :rremove the filename suffix from the filename ( r~ “root”, ie the root of the name with no後綴)並:t刪除路徑名的目錄部分(t~“tail”,即路徑名的尾部)。

要按降序(按名稱)對名稱進行排序,請在zshshell 中使用

print -rC1 -- ./**/*.sh(DNOn:r:t)

…其中添加的On意思是“按名稱倒序排列”。

bash在頂部對循環的輸出進行排序是通過輸出傳遞的問題sort -r

for name in ./*.sh; do
   basename "$name" .sh
done | sort -r

同樣使用find命令:

find . -name '*.sh' -exec basename {} .sh \; | sort -r

但是請注意,如果任何文件名包含嵌入的換行符,這會給您帶來奇怪的結果。

引用自:https://unix.stackexchange.com/questions/689850