
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 的情況下,該技術通常很有用。