2

拡張子 X ( .js) のファイルを再帰的に検索し、同じディレクトリに拡張子 Y ( .ts)のファイルのコピーを作成する方法を探しています。

例 /foo/bar/foobar.js --> /foo/bar/foobar.js および /foo/bar/foobar.ts

/foo/bar.js --> /foo/bar.js および /foo/bar.ts など

私のデューデリジェンス:私は find & xargs & cp とブレース展開 ( cp foobar.{js,ts}) を使用することを考えていましたが、xargs はブレースを使用して xargs から渡されたファイルのリストを示します。これは、ブレースの展開/置換である素晴らしいソースを最近発見したばかりなので、私を悲しくさせます.

1行の解決策が必要な気がしますが、思いつくのに苦労しています。

タスクを実行するためのアイデアを見つけました。目的のディレクトリを新しいディレクトリにコピーしてから、このディレクトリを新しいディレクトリとマージします。各ディレクトリで名前変更スクリプトを再帰的に実行します。rsync を使用してコピーします。find、xargs、および cpio を使用します。

現状では、このような名前変更スクリプト スクリプトを実行することは、私がやっていることのようです。

4

1 に答える 1

7
find . -name "*.js" -exec bash -c 'name="{}"; cp "$name" "${name%.js}.ts"' \;

を使用すると、オプションfindを使用して、見つけたファイルに対して直接コマンドを実行できます。-execxargs を介してパイプする必要はありません。コマンド名の後にコマンドへの引数が続き、その後に単一の引数が続きます;。これは、シェルが解釈しないようにエスケープする必要があります。コマンド名または引数にfind出現する は、見つかったファイルに置き換えられます。{}

適切な末尾を置換してコマンドを呼び出すには、いくつかの方法がありますが、簡単な方法は Bash のパラメーター展開を使用することです。名前を含むシェル パラメーターを定義する必要があります (この場合、私は創造的に を選択しましname={}た)。その後、パラメーター展開を使用できます。の値から${variable%suffix}取り除きます。最後に追加すると、探している名前が表示されます。suffix$variable.ts

于 2012-10-16T21:27:16.947 に答える