'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。つまり、ディレクトリにファイル以上の内容が含まれているOP質問のわずかな一般化も満たします.png

sed -nこの手法は、grep + sedが利用可能な状況でしばしば役立ちます。

関連情報