web-dev-qa-db-ja.com

再帰的cpは、OSXのフォルダーではなくフォルダーの内容をコピーします

ターミナルでは(bashとtcshを使用)、フォルダー引数の末尾に/が付いている場合、cp-rはフォルダーではなくフォルダーの内容をコピーします。

次の構造が与えられます:

folderA
  |-fileA
  |-fileB

次のコマンドは、folderAを宛先にコピーする代わりに、fileAとfileBを宛先にコピーします。

cp -r folderA/ destination

だからそれはとして機能します

cp -r folderA/* destination

デフォルトではtcshで完了すると、フォルダーの最後に/が追加されるため、これは非常に面倒です。そのため、最後の/を削除し忘れると、常にクリーンアップする必要があります。この動作は、私が取り組んだ他のすべての* nixとは異なります。

これを変更して、cp -r folderA /にその内容の代わりにフォルダーをコピーさせる方法はありますか?

6
lajos

この振る舞いがより理にかなっている場合があります(そして、GNU/Linux上でもrsyncによって使用されていると思います)。次の場合を考えてみましょう。

 mydir
   |-.fileA
   |-fileB

これらの3つの指定子のセマンティクスはすべて異なります。

 cp -r mydir   dest/   # creates dest/mydir, containing both files
 cp -r mydir/  dest/   # copies both files directly into dest
 cp -r mydir/* dest/   # copies fileB, but not .fileA, directly into dest

これはBSDとGNUの違いの一例だと思います。 fink を使用してGNUフレーバーツールをインストールできます( coreutilsパッケージ を参照))が、これらはすべてのHFS +メタデータを保持しない可能性があるため、注意して続行してください。

コマンドをインターセプトして、末尾のスラッシュを取り除くことができます。読者や他の回答者に演習として残しておきます。

最初にスラッシュが追加されないように、タブ補完の動作を変更できます。 ~/.tcshrcに以下を追加します。

 unset addsuffix

~/.inputrcに以下を追加することで、bashおよびmiscreadlineユーティリティで同様の効果を実現できます。

 set mark-directories off
7
Matt G

デフォルトのインストールで追加された「/」を手動で削除せずに?残念ながら、AppleのDarwin man page for cpに記載されているように、「source_fileが/で終わる場合、ディレクトリ自体ではなく、ディレクトリの内容がコピーされます。」したがって、それはダーウィンのcpの設計の一部であるように見えます。

ただし、ディレクトリへの追加から「/」を削除するために、addsuffixtcshシェル変数の設定を解除することは可能です。大きな欠点は、ディレクトリを扱っているのかファイルを扱っているのかを、完成したばかりで見分けるのが非常に難しいことです。これを行うには、コマンドラインで入力します(または.tcshrcに追加します)。

 unset addsuffix

bashの場合、mark-directories設定を使用できます。次のように入力するか、.bashrcに追加できます。

 bind 'set mark-directories off'

マークディレクトリの使用元: MacNNフォーラム:Hal Itosis

2
Chealion

「コマンドを傍受して、末尾のスラッシュを取り除くことができます。これは、読者または他の回答者に演習として残しておきます。」追加

function cp() { /bin/cp $(echo "$*" | sed 's|/ | |g'); }

〜/ .bashrcにトリックを行うようです。

1
J. Doe