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

相关内容