次のコマンドを使用してファイル名を印刷したいが、拡張子を含むファイル名が印刷されます。
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 '*.*'
: 拡張子を含むファイル名