シェルグローブマッチに対応する文字列を返します。

シェルグローブマッチに対応する文字列を返します。

というサブディレクトリがあるとしましょうsub。次に、そのディレクトリにある「txt」拡張子を持つすべてのファイルに対して作業を実行したいと思います。私は次のようなものが欲しい

for f in sub/*.txt
do
    enscript -b "" -o {$f basename excluding .txt}.ps sub/{$f basename excluding .txt}.txt                                                                                                                             
    ps2pdf {$f basename excluding .txt}.ps {$f basename excluding .txt}.pdf
done

subしたがって、フォームのディレクトリにファイルが1つしかない場合*.txt(例:)sub/foo.txt、スクリプトは次に展開する必要があります。

enscript -b "" -o foo.ps sub/foo.txt                                                                                                                                   
ps2pdf foo.ps foo.pdf

私は通常ポータブルソリューションを好むが、仕事を行うための様々な方法を学ぶことは常に楽しいです。したがって、移植不可能であっても大丈夫です。お客様のソリューションが移植可能か移植不可能かを表示してください。また、タイトルが良くない場合がありますので、自由に修正してください。

編集:作成された例はディレクトリfoo.txtにあるので、渡す必要があるので理解できないことに気づきました。また、-pオプションをもう少し標準的なものに変更しました。subsub/foo.txtenscriptenscript-o

ベストアンサー1

POSIXシェル(bash、dash、kshなど)は、${var%suffix}変数の値から末尾の部分を削除するために使用できる構文を受け入れます。たとえば、ifはpath="sub/file.txt"${path%.txt} 拡張されますsub/file

接頭辞を削除する対称構造があります${var#prefix}。プレフィックスはパターンです。#最長一致プレフィックスを2倍にします。たとえば、 if はpath=sub/dir/file.txt${path##*/}拡張されますfile.txt(および${path#*/}で拡張されますdir/file.txt)。サフィックスの合計も同様です%

したがって、あなたの場合は、次のように書くことができます。 (少なくともPOSIX構成を使用するだけでなく、プレフィックスの削除とサフィックスの削除を単一の拡張に組み合わせることはできません。)

for f in sub/*.txt; do
  base=${f%.txt}
  base=${base##*/}
  enscript -b "" -o "$base.ps" "$f"
  ps2pdf "$base.ps" "$base.pdf"
done

またはGNU 基本名このコマンドは、削除するファイル拡張子であるオプションの2番目のパラメーターを受け入れます。たとえば、その場合は$f拡張します。file.txt$(basename $f .txt)file

ただし、これを行うと、basename最後のコンポーネントを除くすべてのパス情報が削除されるため、拡張のみを削除するには再挿入する必要があります(参照 ディレクトリ名注文する)。

おすすめ記事