2017-01-31 6 views
2

".ipynb"という拡張子を持つすべてのファイルを探したい(サブディレクトリを持つ)ディレクトリがあります。しかし、私は 'find'コマンドで拡張子を付けずにこれらのファイル名を返すだけです。'find'を使って拡張子のないファイル名を返す

私は、最初の部分を知っている:

find . -type f -iname "*.ipynb" -print  

をしかし、どのように私は、「ipynb」拡張子のない名前を得るのですか? 任意の返信が大幅にしようと、拡張子のないファイル名のみを返すには...

答えて

1

を感謝:

find . -name "*.ipynb" -execdir sh -c 'printf "%s\n" "${0%.*}"' {} ';' 

か:

find "$PWD" -type f -iname "*.ipynb" -execdir basename {} .ipynb ';' 

か:

find . -type f -iname "*.ipynb" -exec basename {} .ipynb ';' 

しかしbasenameを呼び出します各ファイルには非効率なので、@CharlesDuffy sugg estionは次のとおりです。私たちはそれぞれのbashのインスタンスに複数のファイルを渡しているので、リスト全体が単一のコマンドラインに収まるならば、我々は一度だけのbashを呼び出す+ meansを使用して

find . -name '*.ipynb' -exec bash -c 'printf "%s\n" "${@%.*}"' _ {} + 


試して、同じ行に(拡張子なし)の完全なパスとファイル名を印刷するには:

find . -name "*.ipynb" -exec sh -c 'printf "%s\n" "${0%.*}"' {} ';' 

または:

find "$PWD" -type f -iname "*.ipynb" -print | grep -o "[^\.]\+" 

を完全なパスとファイル名を印刷します別の行に:

find "$PWD" -type f -iname "*.ipynb" -exec dirname "{}" ';' -exec basename "{}" .ipynb ';' 
+0

'basename'を適用しますディレクトリコンポーネントも破棄します。 – user1934428

+0

私はこれが頼まれていると信じて、拡張子のないファイル名だけをリストアップします。 – kenorb

+1

ありがとうございます...あなたの答えは私の質問に最もよく答えます... –

0

ディレクトリでなく、拡張子なしの名前を持つ必要がある場合:

find . -type f -iname "*.ipynb" | sed 's/\.ipynb$//1' 
2

ここでは簡単な解決策です。 -Pフラグは、Perlの正規表現に従って一致します。これは、lookahead(?=[.])を動作させるために必要です。

0
find . -type f -iname "*.ipynb" | grep -oP '.*(?=[.])' 

のみ一致する部分-oフラグ出力:

find . -type f -iname "*.ipynb" -exec sh -c 'f=$(basename $1 .ipynb);d=$(dirname $1);echo "$d/$f"' sh {} \; 
0

Perlのワンライナー
あなたは次に


find . | perl -a -F/ -lne 'print $F[-1] if /.*.ipynb/g'

がないあなたのコード
何をしたくない何をしたい
find . | perl -a -F/ -lne 'print $F[-1] if !/.*.ipynb/g'

NOTE
Perl.を追加する必要があります。だからあなたのパターンは、拡張子以外の任意のファイル名に、この「.ipynb」文字列は発生がありません場合は、あなたがtrを使用して、この簡単な方法を試すことができます.*.ipynb

0

次のようになります。

find . -type f -iname "*.ipynb" -print | tr -d ".ipbyn" 
関連する問題