15

プログラムへの入力として与えるために、ディレクトリからファイルのリストを取得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 のリストを取得して、長いパス名とファイル拡張子なしでプログラムにフィードしたいと考えています。しかし、私はそこから始める方法についての手がかりがありません! どんなヒントでも大歓迎です!

4

3 に答える 3

28

ファイル名を保持するために配列を使用することをお勧めします。文字列変数は、スペースを含むファイル名を処理しません。

また、basenameコマンドを使用する必要はありません。代わりに、bash の組み込み文字列操作を使用してください。

これを試して:

files=( /very/long/path/to/various/files/*.file )
for file in "${files[@]}"
do
  filename="${file##*/}"
  filenameWithoutExtension="${filename%.*}"
  echo "$filenameWithoutExtension"
done
于 2013-09-17T09:29:31.913 に答える
9

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

起こりうるもう 1 つのことは、"archive.tar.gz" のようなファイル名を持つことです。この場合、2 つ (または複数の拡張子) を持つことになります。その後、より greddy 演算子を使用できます

for file in $files
do
  file_name=$(basename $file)
  file_name_witout_ext=${file_name%%.*}
done
于 2013-09-17T09:20:57.697 に答える
3

次のように簡単です。

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

または、それらを単一の引数としてのみ渡すことができる場合:

progname -files "${files[*]}" -names "${names[*]}"
于 2013-09-17T13:17:34.580 に答える