find -execから部分文字列を削除する

find -execから部分文字列を削除する

使用するとき

$ find . -name string~ -exec cp {} FOO \;

bashサブストリングで通常行うように、{}inを使用してチルダ文字を削除する方法はありますか?FOO

たとえば、

 $ echo ${string%substring}

私の目標は、string〜というファイルをstringにコピーすることです(その逆も同様です$ find . -name string -exec cp {} {}~ \;)。

ベストアンサー1

この場合、結果シェルをコード実行で埋める必要があります。

find . -name '*~' -exec sh -c 'cp "$0" "${0%~}"' {} \;

これにより、スクリプトを作成する必要がなくなります。一文だけでも可能です。


--注:ここでは、「オプションの終わり」指定子は必要ありません。これは、見つかったファイルにプレフィックスが付けられ、オプションで解析されるのを防ぐためですcpfind./cp

(このプレフィックスの例外は、./現在のディレクトリ.自体が「発見」されている場合ですが、もちろん名前はチルダで終わらず、オプションフラグで誤解されることはありません。)


生成されたシェルを使用して、コピー名にチルダを追加することもできます。つまり、次を使用します。

find . -name string -exec sh -c 'cp "$1" "$1"~' find-sh {} \;

以下を優先します。

find . -name string -exec cp {} {}~ \;  # Don't use this!

後者はPOSIXで指定されていないため、移植性はありません。

~からPOSIX仕様find:

もしユーティリティ名またはディスカッション文字列に「{}」の2文字が含まれているかどうかは実装によって定義されますが、「{}」の2文字のみが含まれるわけではありません。探すこれら2つの文字を置き換えるか、変更されていない文字列を使用してください。

...2 文字 "{}" を含む引数が複数ある場合、動作は指定されません。

おすすめ記事