Bash extracting file basename from long path

我与影子孤独终老i 提交于 2019-12-18 19:15:27

问题


In bash I am trying to glob a list of files from a directory to give as input to a program. However I would also like to give this program the list of filenames

files="/very/long/path/to/various/files/*.file"

So I could use it like that.

prompt> program -files $files -names $namelist

If the glob gives me :

/very/long/path/to/various/files/AA.file /very/long/path/to/various/files/BB.file /very/long/path/to/various/files/CC.file /very/long/path/to/various/files/DD.file /very/long/path/to/various/files/ZZ.file

I'd like to get the list of AA BB CC DD ZZ to feed my program without the long pathname and file extension. However I have no clue on how start there ! Any hint much appreciated !


回答1:


It's better to use an array to hold the filenames. A string variable will not handle filenames which contain spaces.

Also, you don't need to use the basename command. Instead use bash's built-in string manipulation.

Try this:

files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
  filename="${file##*/}"
  filenameWithoutExtension="${filename%.*}"
  echo "$filenameWithoutExtension"
done



回答2:


Solution with basename for your question

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%.file}
done

edit (generic way to extract filename without (single) extension)

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%.*}
done

Another thing that can happen is to have filename like "archive.tar.gz". In this case you will have two (or multiple extension). You can then use a more greddy operator

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%%.*}
done



回答3:


It's simpler like this:

files=(/very/long/path/to/various/files/*.file)
names=("${files[@]##*/}") names=("${names[@]%.*}")
progname -files "${files[@]}" -names "${names[@]}"

Or if you could only pass them as a single argument:

progname -files "${files[*]}" -names "${names[*]}"


来源:https://stackoverflow.com/questions/18845814/bash-extracting-file-basename-from-long-path

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!