Using 'find' to return filenames without extension

前端 未结 9 1510
无人及你
无人及你 2020-12-15 22:37

I have a directory (with subdirectories), of which I want to find all files that have a \".ipynb\" extension. But I want the \'find\' command to just return me these filenam

相关标签:
9条回答
  • 2020-12-15 22:52

    To return only filenames without the extension, try:

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

    or (omitting -type f from now on):

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

    or:

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

    or:

    find . -iname "*.ipynb" | sed "s/.*\///; s/\.ipynb//"
    

    however invoking basename on each file can be inefficient, so @CharlesDuffy suggestion is:

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

    or:

    find . -iname '*.ipynb' -execdir basename -s '.sh' {} +
    

    Using + means that we're passing multiple files to each bash instance, so if the whole list fits into a single command line, we call bash only once.


    To print full path and filename (without extension) in the same line, try:

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

    or:

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

    To print full path and filename on separate lines:

    find "$PWD" -iname "*.ipynb" -exec dirname "{}" ';' -exec basename "{}" .ipynb ';'
    
    0 讨论(0)
  • 2020-12-15 22:55

    I found this in a bash oneliner that simplifies the process without using find

    for n in *.ipynb; do echo "${n%.ipynb}"; done
    
    0 讨论(0)
  • 2020-12-15 22:55

    Perl One Liner
    what you want
    find . | perl -a -F/ -lne 'print $F[-1] if /.*.ipynb/g'

    Then not your code
    what you do not want
    find . | perl -a -F/ -lne 'print $F[-1] if !/.*.ipynb/g'

    NOTE
    In Perl you need to put extra .. So your pattern would be .*.ipynb

    0 讨论(0)
  • 2020-12-15 22:59

    If there's no occurrence of this ".ipynb" string on any file name other than a suffix, then you can try this simpler way using tr:

    find . -type f -iname "*.ipynb" -print | tr -d ".ipbyn"
    
    0 讨论(0)
  • 2020-12-15 22:59

    If you don't know that the extension is or there are multiple you could use this:

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

    and for a list of files with no duplicates (originally differing in path or extension)

    find . -type f -exec basename {} \;|perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'|sort|uniq
    
    0 讨论(0)
  • 2020-12-15 23:05

    Here's a simple solution:

    find . -type f -iname "*.ipynb" | sed 's/\.ipynb$//1'
    
    0 讨论(0)
提交回复
热议问题