ターミナルでは(bashとtcshを使用)、フォルダー引数の末尾に/が付いている場合、cp-rはフォルダーではなくフォルダーの内容をコピーします。
次の構造が与えられます:
folderA
|-fileA
|-fileB
次のコマンドは、folderAを宛先にコピーする代わりに、fileAとfileBを宛先にコピーします。
cp -r folderA/ destination
だからそれはとして機能します
cp -r folderA/* destination
デフォルトではtcshで完了すると、フォルダーの最後に/が追加されるため、これは非常に面倒です。そのため、最後の/を削除し忘れると、常にクリーンアップする必要があります。この動作は、私が取り組んだ他のすべての* nixとは異なります。
これを変更して、cp -r folderA /にその内容の代わりにフォルダーをコピーさせる方法はありますか?
この振る舞いがより理にかなっている場合があります(そして、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
デフォルトのインストールで追加された「/」を手動で削除せずに?残念ながら、AppleのDarwin man page for cpに記載されているように、「source_fileが/で終わる場合、ディレクトリ自体ではなく、ディレクトリの内容がコピーされます。」したがって、それはダーウィンのcp
の設計の一部であるように見えます。
ただし、ディレクトリへの追加から「/」を削除するために、addsuffix
のtcsh
シェル変数の設定を解除することは可能です。大きな欠点は、ディレクトリを扱っているのかファイルを扱っているのかを、完成したばかりで見分けるのが非常に難しいことです。これを行うには、コマンドラインで入力します(または.tcshrcに追加します)。
unset addsuffix
bash
の場合、mark-directories
設定を使用できます。次のように入力するか、.bashrcに追加できます。
bind 'set mark-directories off'
マークディレクトリの使用元: MacNNフォーラム:Hal Itosis
「コマンドを傍受して、末尾のスラッシュを取り除くことができます。これは、読者または他の回答者に演習として残しておきます。」追加
function cp() { /bin/cp $(echo "$*" | sed 's|/ | |g'); }
〜/ .bashrcにトリックを行うようです。