'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

このジョブに必要なのはシェルだけです。

POSIX 的には:

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のオプションは必要ありません。lsls
  • オプションは「デフォルトでは行を印刷しない」-nという意味ですsed
  • /p置換の最後のオプションは、「...置換が行われた場合はこの行を印刷する」という意味です。

.pngその最終的な効果は、 を削除して で終わる行だけを出力することです.png。つまり、これは、ディレクトリに.pngファイルだけが含まれていないという OP の質問の若干の一般化にも対応します。

このsed -n手法は、grep+sed を使用する場合に役立つことがよくあります。

関連情報