使用するとき
$ 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%~}"' {} \;
これにより、スクリプトを作成する必要がなくなります。一文だけでも可能です。
--
注:ここでは、「オプションの終わり」指定子は必要ありません。これは、見つかったファイルにプレフィックスが付けられ、オプションで解析されるのを防ぐためですcp
。find
./
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 文字 "{}" を含む引数が複数ある場合、動作は指定されません。