linux findコマンドは、拡張子なしで未知の拡張子を持つファイル名を探します。

linux findコマンドは、拡張子なしで未知の拡張子を持つファイル名を探します。

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

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

私のディレクトリには拡張子が異なるファイルがたくさんあります。--ignore='*.*'前後に追加しようとしましたが、-printf成功しませんでした。例:myfile1.txt、myfile2.mp3などのファイルがあります。 myfile1、myfile2などを印刷するために必要です。どうすればいいですか?

答え1

正しく理解したら(いいえ。答えの2番目の部分を参照してください。)、ドット文字を含むファイル名を一覧表示しないようにします。

これを行うことができます:

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

ファイル名ワイルドカードパターンは、*.*1つ以上のドットを含むすべてのファイル名と一致します。上記は!一致の意味を無効にします。つまり、最後に到達したパス名は、名前にドットがないファイルのパス名になります。存在する本当に古い!シェルからエスケープ\!(またはUnixインストールのアップデート)を望むこともできます。孤独な人は!電話しないでくださいbash歴史的な拡張施設

GNUを使用して、見つかったパス名のファイル名部分のみを印刷してくださいfind

find . -type f ! -name '*.*' -printf '%f\n'

標準find(またはGNU find)の場合:

find . -type f ! -name '*.*' -exec basename {} \;

ループ内でコマンド置換に使用する前に検索結果を繰り返すのはなぜ悪い習慣ですか?」。


名前の最後のドットの後のすべてのエントリを削除しながらすべてのファイル名を一覧表示するには(「拡張子の削除」)、次のように使用できます。

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オプションについて」。

答え2

Linuxにはファイル拡張子のようなものはありません。ファイル名のAは意味.がありません。.最初隠しファイルで識別するファイル名の文字).

また、システムのマニュアルページを確認してもオプションはfind表示されません。--ignore

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

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

答え3

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

例えば

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

ディレクトリが存在し、リストに表示されないようにするには、次の手順を実行します。

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

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

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

答え4

努力する

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

どこ

  • \!:そうではありません(!をエスケープする必要があります)
  • name '*.*': 拡張子を含むファイル名

関連情報