web-dev-qa-db-ja.com

'find'を使用して拡張子なしのファイル名を返す

ディレクトリ(サブディレクトリあり)があり、「。ipynb」拡張子を持つすべてのファイルを検索したい。しかし、私は 'find'コマンドが拡張子なしでこれらのファイル名を返すようにしたいと思っています。

私は最初の部分を知っています:

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

しかし、「ipynb」拡張子なしで名前を取得するにはどうすればよいですか?返信は大歓迎です...

11

拡張子なしのファイル名のみを返すには、次を試してください。

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 の提案は次のとおりです。

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

+意味 各bashインスタンスに複数のファイルを渡すことになるため、リスト全体が1つのコマンドラインに収まる場合は、bashを1回だけ呼び出します。


フルパスとファイル名(拡張子なし)を同じ行に出力するには、次のことを試してください。

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 ';'
8
kenorb

ここに簡単な解決策があります:

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

Perl One Liner
必要なもの
find . | Perl -a -F/ -lne 'print $F[-1] if /.*.ipynb/g'

それからあなたのコードではない
不要なもの
find . | Perl -a -F/ -lne 'print $F[-1] if !/.*.ipynb/g'

[〜#〜]ノート[〜#〜]
Perlでは、余分な.。したがって、パターンは.*.ipynb

0
Shakiba Moshiri

basenameを使用する別の簡単な方法は次のとおりです。

find . -type f -iname '*.ipynb' -exec basename -s '.ipynb' {} +

+を使用すると、コマンドの呼び出し回数が減少します( manpage ):

-execコマンド{} +

この-execアクションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を末尾に追加することによって構築されます。コマンドの呼び出しの総数は、一致したファイルの数よりもはるかに少なくなります。コマンドラインは、xargsがコマンドラインをビルドするのとほぼ同じ方法でビルドされます。コマンド内では '{}'のインスタンスが1つだけ許可され、(findがシェルから呼び出されている場合)シェルで解釈されないように引用符で囲む必要があります(たとえば、 '{}')。コマンドは、開始ディレクトリで実行されます。 `+ '形式での呼び出しがゼロ以外の値を終了ステータスとして返す場合、findはゼロ以外の終了ステータスを返します。 findでエラーが発生すると、すぐに終了することがあり、保留中のコマンドがまったく実行されない場合があります。このため、-exec my-command ... {} + -quitを実行しても、my-commandが実際に実行されるとは限りません。 -execのこのバリアントは常にtrueを返します。

-sbasename runとともに使用すると、複数のファイル名が受け入れられ、指定されたサフィックスが削除されます( manpage ):

-a、-multiple

複数の引数をサポートし、それぞれをNAMEとして扱います

-s、-suffix = SUFFIX

末尾のSUFFIXを削除します。 -aを意味します

0
bentocin

拡張機能があるかどうかがわからない場合、または複数ある場合は、次のように使用できます。

find . -type f -exec basename {} \;|Perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'

重複のないファイルのリスト(元はパスまたは拡張子が異なる)

find . -type f -exec basename {} \;|Perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'|sort|uniq
0
Diego
find . -type f -iname "*.ipynb" | grep -oP '.*(?=[.])'

-oフラグは、一致した部分のみを出力します。 -Pフラグは、Perlの正規表現に従って一致します。これは lookahead(?=[.])を機能させるために必要です。

0
user1934428

ディレクトリ付きで拡張子なしの名前が必要な場合:

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

Findを使用せずにプロセスを簡略化するbash onelinerでこれを見つけました

for n in *.ipynb; do echo "${n%.ipynb}"; done
0
jjisnow

サフィックス以外のファイル名にこの「.ipynb」文字列が出現しない場合は、trを使用してこの簡単な方法を試すことができます。

find . -type f -iname "*.ipynb" -print | tr -d ".ipbyn"
0
niglesias