簡體   English   中英

Bash從長路徑中提取文件basename

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM