it-swarm.com.ru

Использование 'find' для возврата имен файлов без расширения

У меня есть каталог (с подкаталогами), из которого я хочу найти все файлы с расширением ".ipynb". Но я хочу, чтобы команда 'find' просто возвращала мне эти имена файлов без расширения. 

Я знаю первую часть:

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

Но как я могу получить имена без расширения "ipynb"?. Любые ответы с благодарностью ...

4
Siavosh Mahboubian

Чтобы вернуть только имена файлов без расширения, попробуйте:

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, поэтому, если весь список помещается в одну командную строку, мы вызываем bash только один раз.


Чтобы напечатать полный путь и имя файла (без расширения) в одной строке, попробуйте:

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

Вот простое решение:

find . -type f -iname "*.ipynb" | sed 's/\.ipynb$//1'
7
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

Если вы не знаете, что это расширение или есть несколько, вы можете использовать это:

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

Если эта строка ".ipynb" не встречается ни в одном имени файла, кроме суффикса, вы можете попробовать этот более простой способ, используя tr:

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