
というサブディレクトリがあるとしましょう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オプションをもう少し標準的なものに変更しました。sub
sub/foo.txt
enscript
enscript
-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
最後のコンポーネントを除くすべてのパス情報が削除されるため、拡張のみを削除するには再挿入する必要があります(参照
ディレクトリ名注文する)。
答え2
移植可能な方法は、拡張子${f%.*}
とディレクトリを使用して削除することです${f##*/}
(またはbasename
。
zshでは申請できます様々な変身到着パラメータ拡張、含む履歴修飾子r
たとえば、拡張機能の削除やt
ディレクトリ部分の削除などがあります。
for x in sub/*.txt; do
enscript -b "" -o ${x:t:r}.ps $x
ps2pdf ${x:t:r}.ps ${x:t:r}.pdf
done
履歴修飾子を適用できます。グローバルモードしかも。
for x in sub/*.txt(:r:t); do
enscript -b "" -o $x.ps sub/$x.txt
ps2pdf $x.ps $x.pdf
done