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

おすすめ記事