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
。つまり、ディレクトリにファイル以上の内容が含まれているOP質問のわずかな一般化も満たします.png
。
sed -n
この手法は、grep + sedが利用可能な状況でしばしば役立ちます。