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 的情况下,该技术通常很有用。