[英]Bash extracting file basename from long path
在bash
我試圖glob
從目錄中的文件列表,得到輸入到程序。 但是,我還想給這個程序提供文件名列表
files="/very/long/path/to/various/files/*.file"
所以我可以這樣使用它。
prompt> program -files $files -names $namelist
如果glob
給了我:
/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
我想獲得AA BB CC DD ZZ的列表,以便在沒有長路徑名和文件擴展名的情況下提供我的程序。 但是我不清楚如何從那里開始! 任何提示非常感謝!
最好使用數組來保存文件名。 字符串變量不會處理包含空格的文件名。
此外,您不需要使用basename
命令。 而是使用bash的內置字符串操作。
嘗試這個:
files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
filename="${file##*/}"
filenameWithoutExtension="${filename%.*}"
echo "$filenameWithoutExtension"
done
針對您的問題使用basename
解決方案
for file in $files
do
file_name=$(basename $file)
file_name_witout_ext=${file_name%.file}
done
編輯(沒有(單個)擴展名提取文件名的通用方法)
for file in $files
do
file_name=$(basename $file)
file_name_witout_ext=${file_name%.*}
done
可能發生的另一件事是擁有像“archive.tar.gz”這樣的文件名。 在這種情況下,您將有兩個(或多個擴展名)。 然后,您可以使用更多的greddy運算符
for file in $files
do
file_name=$(basename $file)
file_name_witout_ext=${file_name%%.*}
done
它更簡單:
files=(/very/long/path/to/various/files/*.file)
names=("${files[@]##*/}") names=("${names[@]%.*}")
progname -files "${files[@]}" -names "${names[@]}"
或者,如果您只能將它們作為單個參數傳遞:
progname -files "${files[*]}" -names "${names[*]}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.