次のコマンドを使用してファイル名を印刷したいのですが、拡張子付きで印刷されます。
find . -type f -printf '%f\n'
私のディレクトリには、異なる拡張子を持つ多くのファイルがあります。追加してみました--ignore='*.*'
の前後両方-printf
、しかしそれはうまくいきませんでした。例; myfile1.txt、myfile2.mp3などのファイルがあります。myfile1、myfile2などを出力する必要があります。これを行うにはどうすればよいですか?
私があなたを正しく理解している場合(私は理解していません。回答の2番目の部分を参照してください)、ドット文字を含むファイル名のリストは避けたいです。
これはそれを行います:
find . -type f ! -name '*.*'
ファイル名展開パターン*.*
は、少なくとも1つのドットを含むすべてのファイル名に一致します。上記の!
は一致の意味を無効にします。つまり、最後まで到達するパス名は、名前にドットを含まないファイルのパス名になります。 really Ancientシェルでは、!
を\!
としてエスケープすることができます(またはUnixインストールを更新します)。唯一の!
は bash
の履歴拡張機能 を呼び出しません。
GNU find
を使用して、見つかったパス名のファイル名コンポーネントのみを出力するには:
find . -type f ! -name '*.*' -printf '%f\n'
標準のfind
(またはGNU find
)を使用):
find . -type f ! -name '*.*' -exec basename {} \;
ループのコマンド置換でこれを使用する前に、「 findの出力の悪い習慣をループするのはなぜですか? 」を参照してください。
すべてのファイル名をリストし、同時に名前の最後のドット以降をすべて削除する(「拡張子を削除する」)には、次のようにします。
find . -type f -exec sh -c '
for pathname do
pathname=$( basename "$pathname" )
printf "%s\n" "${pathname%.*}"
done' sh {} +
これにより、見つかったすべてのファイルのすべてのパス名が短いシェルループに送信されます。ループは各パス名を取得し、basename
を呼び出してパス名のファイル名コンポーネントを抽出し、最後のドットが削除された後のすべてを含む結果の文字列を出力します。
パラメータ拡張${pathname%.*}
は、「.*
の値の末尾から、$pathname
(リテラルドットとそれに続く任意のテキスト)」に一致する最短の文字列を削除することを意味します。ファイル名の最後のドットの後のファイル名サフィックスを削除する効果があります。
find ... -exec ... {} +
の詳細については、たとえば、 " ` find`の-execオプションについて 。
Linuxでは、ファイル拡張子などはありません。ファイル名の.
は、まったく意味がありません(ファイル名の.
がfirstの文字であることから、隠しファイルとして識別されます)。
また、私のシステムでfind
のマニュアルページを確認すると、--ignore
オプションが表示されません。
つまり、名前に.
が含まれるファイルを無視する場合は、find
の-not
演算子を使用できます。
find -type f -not -name '*.*' -print
他の人が指摘したように、「拡張」はUnixシステムにとって実際には何も意味しません。ただし、単純なsed
コマンドを使用して、リストからそれらを削除できます。
例えば.
find * -type f -print | sed 's/\.[^.]*$//'
ディレクトリがあり、それらをリストに表示したくない場合は、
find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'
単一のディレクトリの場合、ls
の代わりにfind
を使用できます
ls | sed 's/\.[^.]*$//'
試す
find . -type f \! -name '*.*' -print
どこ
\!
:なし(!はエスケープする必要があります)name '*.*'
:拡張子付きのファイル名