私はディレクトリとそのサブディレクトリにあるファイルのリストを返すために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.txt
2番目の引数として使用します。
これは明らかにoutput.txt
見つかったすべてのファイルを上書きしますが、次は-converted.txt
元のファイルと同じ名前のファイルを作成し、名前の末尾に(元のファイルと同じディレクトリに)追加してこの問題を解決します。
find "$directory" -type f -name '*.epub' -exec ebook-convert {} {}-converted.txt \;
これ可能find
2番目のファイルを見つかったファイルのパス名に置き換えることはできないため、すべての実装では機能しません{}
(他の文字列に関連付けられていますが、たとえばGNUがfind
処理するため)。この問題を解決するには:
find "$directory" -type f -name '*.epub' -exec sh -c '
for pathname do
ebook-convert "$pathname" "$pathname"-converted.txt
done' sh {} +
次のワイルドカードパターンをサポートするシェルを使用してくださいbash
。zsh
**
for pathname in "$directory"/**/*.epub; do
ebook-convert "$pathname" "$pathname"-converted.txt
done
(これは必要shopt -s globstar
でbash
処理されます。どの*.epub(.)
in を使用するzsh
か-f
for in を明示的にテストしない限り、通常のファイルだけでなく名前とも一致しますbash
。