パイプを使用して出力ファイル名を指定するには?

パイプを使用して出力ファイル名を指定するには?

私はディレクトリとそのサブディレクトリにあるファイルのリストを返すためにfindを使います。

find $directory -type f -name "*.epub"

次に、入出力ファイル名を指定する必要があるコマンドを使用したいと思います。

ebook-convert input.epub output.txt

出力が入力と同じディレクトリ/サブディレクトリに保存されるように、.epubそれぞれを変換したいと思います。.txt単純なパイプは機能しません。

find $directory -type f -name "*.epub" | ebook-convert

どうすればいいですか?

ベストアンサー1

秘訣はいいえファイルのリストを作成してから繰り返します(例:検索結果を繰り返すのはなぜ悪い習慣ですか?)。

find "$directory" -type f -name '*.epub' -exec ebook-convert {} output.txt \;

*.epubこれは、一致する名前のディレクトリ内または下のすべての一般的なファイルを探します$directory。各コマンドは、ebook-convert見つかったファイルのパス名を最初とoutput.txt2番目の引数として使用します。

これは明らかにoutput.txt見つかったすべてのファイルを上書きしますが、次は-converted.txt元のファイルと同じ名前のファイルを作成し、名前の末尾に(元のファイルと同じディレクトリに)追加してこの問題を解決します。

find "$directory" -type f -name '*.epub' -exec ebook-convert {} {}-converted.txt \;

これ可能find2番目のファイルを見つかったファイルのパス名に置き換えることはできないため、すべての実装では機能しません{}(他の文字列に関連付けられていますが、たとえばGNUがfind処理するため)。この問題を解決するには:

find "$directory" -type f -name '*.epub' -exec sh -c '
    for pathname do
        ebook-convert "$pathname" "$pathname"-converted.txt
    done' sh {} +

次のワイルドカードパターンをサポートするシェルを使用してくださいbashzsh**

for pathname in "$directory"/**/*.epub; do
    ebook-convert "$pathname" "$pathname"-converted.txt
done

(これは必要shopt -s globstarbash処理されます。どの*.epub(.)in を使用するzsh-ffor in を明示的にテストしない限り、通常のファイルだけでなく名前とも一致しますbash

おすすめ記事