79

私はファイルへのlist.txt相対パスを含むファイル(と呼ばれる)を持っています.1行に1つのパス、つまり次のようなものです:

foo/bar/file1
foo/bar/baz/file2
goo/file3

一度に 1 つのパスを処理し、最後のスラッシュで分割し、パスの 2 つの部分を引数として供給する別のプロセスを起動する bash スクリプトを作成する必要があります。これまでのところ、ループ部分しかありません。

for p in `cat list.txt`
do
   # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2
   inner_process.sh $part1 $part2
done

どうすれば分割できますか? これは、パスにスラッシュがない縮退したケースで機能しますか?

4

4 に答える 4

162

basenameとを使用するdirnameだけです。

part1=$(dirname "$p")
part2=$(basename "$p")
于 2012-12-07T16:43:33.620 に答える
18

適切な 100% bash の方法で、スペースや変な記号を含むファイル名に関して安全です (inner_process.shそれらを正しく処理する場合、それは別の話です):

while read -r p; do
    [[ "$p" == */* ]] || p="./$p"
    inner_process.sh "${p%/*}" "${p##*/}"
done < list.txt

そして、各ファイルに対して (サブシェルで)フォークdirnameしません。basename

この行は、スラッシュが含まれていない[[ "$p" == */* ]] || p="./$p"場合に備えてここにあり、先頭に追加されます。$p./

および記号の詳細については、 Bash リファレンス マニュアルの「シェル パラメータの拡張」セクションを参照してください。%##

于 2012-12-07T19:11:58.377 に答える