'ls -1' :如何列出不含副檔名的檔名

'ls -1' :如何列出不含副檔名的檔名

ls -1像這樣列出我的元素:

foo.png
bar.png
foobar.png
...

我希望它列出時沒有.png類似的內容:

foo
bar
foobar
...

(該目錄僅包含.png檔案)

grep有人可以告訴我在這種情況下如何使用嗎?

目的:我有一個文字文件,其中列出了所有名稱,但沒有擴展名。我想製作一個腳本,將文字檔案與資料夾進行比較,以查看缺少哪個檔案。

答案1

ls -1 | sed -e 's/\.png$//'

sed命令刪除(即用空字串替換).png結尾一個檔名。

.進行轉義,\.以便將其解釋為sed文字.字元而不是正則表達式.(這意味著匹配任何字元)。是$行尾錨點,因此它.png與檔案名稱中間不符。

答案2

您只需要 shell 即可完成這項工作。

POSIXly:

for f in *.png; do
    printf '%s\n' "${f%.png}"
done

zsh

print -rl -- *.png(:r)

答案3

如果你只想使用 bash:

for i in *; do echo "${i%.png}"; done

grep當嘗試尋找匹配項時,您應該伸手去尋找,而不是刪除/替換它sed更合適:

find . -maxdepth 1 -name "*.png"  | sed 's/\.png$//'

一旦您決定需要建立一些子目錄來調整 PNG 檔案的順序,您可以輕鬆地將其變更為:

find . -name "*.png"  | sed 's/\.png$//'

答案4

另一個非常相似的答案(我很驚訝這個特定的變體還沒有出現)是:

ls | sed -n 's/\.png$//p'
  • 您不需要-1選項ls,因為ls假設標準輸出不是終端(在本例中是管道)。
  • 選項-n表示sed“預設不列印該行”
  • /p替換末尾的選項表示「...如果進行了替換,則列印此行」。

其最終效果是僅列印那些以 結尾的行.png,並將其.png刪除。也就是說,這也滿足了OP問題的輕微概括,其中目錄不僅僅包含.png文件。

sed -n在您可能使用 grep+sed 的情況下,該技術通常很有用。

相關內容