2

「find」を使用して一連のHTMLファイルに対してコマンドを実行し、その結果を別のディレクトリにパイプアウトしようとしています。ただし、「find」で見つかったファイル名にパスが含まれており、パスがパイプターゲットのディレクトリ構造に適合していないため、パイプは失敗しています。基本的に、以下の{}の2番目のインスタンスからパスを削除する必要があります。

find subd/*.html -type f -exec "./mycmd {} opts > subd2/{}" \;

これはコマンドの簡略化されたバージョンですが、現実の世界では、mysubdirectory2の前に「../」を付けることは機能せず、「cdsubd&&」の前に付けることもできません。

4

5 に答える 5

2

Jonathanのソリューションに似ていますが、不要な余分なスクリプトを削除します。

find subd -name '*.html' -type f -exec sh -c '
    for f; do
        ./mycmd "$f" opts > subd2/"${f##*/}"
    done
' _ {} '+'
于 2013-03-25T21:21:55.137 に答える
1

mycmd-invoker'正しいジョブ'を実行するスクリプト(それを呼び出す)を作成し、それを次の場所から実行しfindます。

find subd/*.html -type f -exec mycmd-invoker {} +

スクリプトにはパス付きのファイル名のリストが与えられ、問題に対処できます。

for file in "$@"
do
    base=$(basename "$file")
    ./mycmd "$file" opts > subd2/"$base" 
done

mycmd-invokerタスクが完了したら、もう一度実行する必要があると思われる場合を除いて、スクリプトを破棄できます。

于 2013-03-25T16:49:02.033 に答える
1

このようなものが機能するはずです:

while read fn
do
  ./mycmd "${fn}" opts > "subd2/${fn##*/}"
done < <(find subd -type f -name "*.html")
于 2013-03-25T17:12:29.033 に答える
1
find subd/*.html -type f -exec "./mycmd {} opts > subd2/\`basename {}\`" \;

更新:ベース名を囲むバッククォートの前にエスケープを追加しました

于 2013-03-25T17:17:34.877 に答える
0

わかりました。最終的には、二重引用符ではなく一重引用符を使用し、ベース名に$()評価フォームを使用するという解決策を見つけました。

find subd/*.html -type f -exec './mycmd {} opts > subd2/$(basename {})' \;

一重引用符が違いである理由や、Andyのソリューションが私のマシンで機能しなかった理由はわかりません。

于 2013-03-26T10:32:59.290 に答える