4

デスクトップに「Images」というフォルダーがあり、そのフォルダー内に3つの画像があります...

File-A-B.gif
File-C-D.gif
File-E-F.gif

...コマンド ラインでファイルの名前を変更して、2 番目のハイフン/ダッシュを削除したい。したがって、結果は次のような名前のファイルになります...

File-AB.gif
File-CD.gif
File-EF.gif

...相互にパイプされたコマンドの組み合わせを使用していますが、それらを機能させるのにあまり運がありません。

最初は持っていたls File-* | sed 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

このコマンドの内訳は...

  • で始まるファイルをすべてリストしますFile-
  • 結果をパイプしてsed
  • sed名前のさまざまな部分をキャプチャするために使用します
  • キャプチャする最初のファイルFile-AB.gif
  • 次に、一致しsedたファイル名を移動コマンドに置き換え、元のファイルの名前を、キャプチャした 2 つのデータで構成されるファイルに変更するように効果的に指示します。
  • 次に、そのコマンドをパイプしてsh

私が得ていた最初のエラーは、権限エラーでした。ファイルへの「読み取りおよび書き込み」アクセス権があったため、その理由はわかりません。

これを回避するにchmod 777は、各ファイルを削除します。

これにより、新しいエラーが発生しましたcannot execute binary file

このエラーを回避するために、次の投稿を見ました: http://blog.mpdaugherty.com/2010/05/27/difference-with-sed-in-place-editing-on-mac-os-x-vs-linux/これは、一重引用符のペアを追加することを提案しています。これが機能する理由は (どうやら) sed、使用するファイル拡張子がわからないためエラーになりますが、空の文字列を配置するとそのエラーが中和されるためです (補足: 私の理解では、-iフラグも使用する必要があるということでした。私は使用していませんが、それを行うと別のエラーが発生したため、それを破棄し、単一引用符を使用してバイナリファイルエラーを回避しました)。

だから今私は持っていますls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

しかし、これはNo such file or directory?

ファイルの場所を明示しようとしたので、たとえば...

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv ~\/Desktop\/Images\/& ~/Desktop\/Images\/\1\2/' | sh

...スラッシュをエスケープする必要がありました~\/Desktop\/Images\/が、それでもうまくいきませんでした。

Homebrewを使用してGNUバージョンもインストールしsedましたが、同様の方法でエラーが発生しましたgsed: can't read s/\(Vim-[^-]\)-\(.+\)/mv & \1\2/: No such file or directory

どうすればこれを機能させることができるのか、少し途方に暮れています。

bash/zsh スクリプトや Ruby スクリプトを作成する必要はありません。

あなたが私に与えることができるどんな助けでも大歓迎です.

4

2 に答える 2

3

以下はあなたのために働くはずです:

ls File-* | sed 's/\(.*\)-\(.*\)/mv & \1\2/' | sh

試したこと

ls File-* | sed '' 's/\(File-[^-]\)-\(.+\)/mv & \1\2/' | sh

かなり近かった。言います:

ls File-* | sed '' 's/\(File-[^-]*\)-\(.*\)/mv & \1\2/' | sh

代わりに機能したでしょう。

于 2013-09-27T13:41:29.377 に答える