
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
のオプションは必要ありません。ls
ls
- オプションは「デフォルトでは行を印刷しない」
-n
という意味ですsed
/p
置換の最後のオプションは、「...置換が行われた場合はこの行を印刷する」という意味です。
.png
その最終的な効果は、 を削除して で終わる行だけを出力することです.png
。つまり、これは、ディレクトリに.png
ファイルだけが含まれていないという OP の質問の若干の一般化にも対応します。
このsed -n
手法は、grep+sed を使用する場合に役立つことがよくあります。