cp -r ~/some/folder/ を避ける方法。すべてのファイルを現在のフォルダの最上位レベルにコピーしますか?

cp -r ~/some/folder/ を避ける方法。すべてのファイルを現在のフォルダの最上位レベルにコピーしますか?

修正する:Mac OS Xでこれが起こります。私はMountain Lionを使用しています。 ) 時にはキーストロークを使用してtabパスを完成させるので、コマンドは次のようになります。

cp -r ~/some/folder/ .

しかし、上記の行は異なる動作をしていることがわかりました。

cp -r ~/some/folder .

2行目はフォルダを現在のディレクトリにコピーしますfolderが、1行目は7つのファイル、6つのサブフォルダをすべて現在のディレクトリにコピーして現在のディレクトリを汚染します。特定の現在のディレクトリにgitまたはsvnを使用するソース管理がないため、実際に手動でクリーンアップする必要がありますが、これはかなり痛いです。

これが起こらないようにする方法はありますか?たとえば、関数、エイリアス、またはBash設定を生成しますか?私はこれを覚えることができることを知っていますが、2ヶ月が経過すると実際に誤って同じことをやり直す可能性があるので、これらの行動に注意するのが最善です。 (それが私が本当に欲しいものなら、cp -r ~/some/folder/* .むしろそれを使うべきです。)cp -r ~/some/folder/.* .

答え1

これを正しく実行するには、cpのすべてのオプションを再分析する必要がありますが、これは良い考えではありません。しかし、ここに近づくべきことがあります。

# run cp command as-given, unless any argument ends in a slash
safecp() {
  for arg; do
    case $arg in */)
      echo "safecp: trailing slash in cp $*" >&2
      return 1
      ;;
    esac
  done
  cp "$@"
}

または配置してみてください。

set mark-directories off

ディレクトリをタブで完成させるときは、bashがスラッシュを自動的に追加しないようにします~/.inputrc

答え2

もちろん、次のようなエラーをキャッチする短いbash関数(正規表現を実行できる最新バージョンのbashを使用すると非常に簡単です)を書くことができます。

function cpr () {
    local src=...
    if [[ "$src" =~ /$ ]]; then
        # handle error
    else
        # proceed with copying
    fi 
}

トリッキーな部分は、destそれが何であるべきか(もちろんターゲットディレクトリをスキップしたい)、そしてオプションのすべての組み合わせを含めたいかcp(少なくともGNU coreutilsにはcp3つの異なる構文バリエーションがあります)を理解することです。

特別な機能を使用してその場所で修正する方が良いかもしれません。

function cpr () {
    cp -R ${1%%/} ${2}
}

関連情報