web-dev-qa-db-ja.com

不明な拡張子の拡張子のないファイル名のlinux findコマンド

次のコマンドを使用してファイル名を印刷したいのですが、拡張子付きで印刷されます。

find . -type f -printf '%f\n'

私のディレクトリには、異なる拡張子を持つ多くのファイルがあります。追加してみました--ignore='*.*'の前後両方-printf、しかしそれはうまくいきませんでした。例; myfile1.txt、myfile2.mp3などのファイルがあります。myfile1、myfile2などを出力する必要があります。これを行うにはどうすればよいですか?

4
kutlus

私があなたを正しく理解している場合(私は理解していません。回答の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オプションについて

4
Kusalananda

Linuxでは、ファイル拡張子などはありません。ファイル名の.は、まったく意味がありません(ファイル名の.firstの文字であることから、隠しファイルとして識別されます)。

また、私のシステムでfindのマニュアルページを確認すると、--ignoreオプションが表示されません。

つまり、名前に.が含まれるファイルを無視する場合は、find-not演算子を使用できます。

find -type f -not -name '*.*' -print
3
DopeGhoti

他の人が指摘したように、「拡張」はUnixシステムにとって実際には何も意味しません。ただし、単純なsedコマンドを使用して、リストからそれらを削除できます。

例えば.

find * -type f -print | sed 's/\.[^.]*$//'

ディレクトリがあり、それらをリストに表示したくない場合は、

find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'

単一のディレクトリの場合、lsの代わりにfindを使用できます

ls | sed 's/\.[^.]*$//'
2
Stephen Harris

試す

find . -type f \! -name '*.*' -print

どこ

  • \!:なし(!はエスケープする必要があります)
  • name '*.*':拡張子付きのファイル名
1
Archemar