web-dev-qa-db-ja.com

Macではcpの動作が異なります

フォルダー全体をコピーする次のコードがあります。

#!/bin/bash

B="H:\pdf2txt"

DST_DIR="H:\Test_Folder"

cp -r "$B" "$DST_DIR"

これはWindowsマシンでは期待どおりに機能しますが、Macでこれに変更すると、次のようになります。

#!/bin/bash

B="/Volumes/Mac_Storage/pdf2txt"

DST_DIR="/Volumes/Mac_Storage/Test_folder"

cp -r "$B" "$DST_DIR"

フォルダーをコピーしますが、その中に同じコンテンツを持つ別のコピーを追加し、ファイルパスが長すぎてMacで処理できないようになるまで、同じコピーを追加します。このようなフォルダー構造:

Test_Folder
|   └── pdf2txt 
|       ├── test1.txt
|       ├── test2.txt
|       └── pdf2txt
|           ├── test1.txt
|           ├── test2.txt
|           └── pdf2txt
|               ├── test1.txt
|               ├── test2.txt
|               └── pdf2txt
|                   ├── test1.txt
|                   ├── test2.txt
|                   └── pdf2txt
|                       ├── test1.txt
|                       ├── test2.txt
|                       └── pdf2txt
|                           ├── test1.txt
|                           ├── test2.txt
|                           └── pdf2txt

などなど。

WindowsとMacで動作が異なる理由は何ですか?

6
madmiddle

私は思う telcoMの答え 主な原因の周りを嗅ぐ:シンボリックリンクが含まれている可能性が高く、それは別のものです。

私の実験に基づいて、法案に合う一連の状況があります:

  • Test_folderpdf2txtへのシンボリックリンクであり、
  • oPは、BSDの遺産を持つストックmacOS cpを使用しています

この種のシンボリックリンクは、macOS cpのサイクル検出を無効にします。 (GNU cpHomebrew または他のパッケージマネージャーによってインストールされた場合と同様に、再帰的にコピーする場合でも、デフォルトではシンボリックリンクをたどりません。)

これがmacOS High Sierraでテストされたデモです。

$ ln -s pdf2txt Test_folder

$ ls -lAF Test_folder
lrwxr-xr-x 1 aho staff 7 Feb 13 20:13 Test_folder -> pdf2txt/

$ /bin/cp -r pdf2txt Test_folder
cp: Test_folder/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt: name too long (not copied)
cp: Test_folder/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt: name too long (not copied)

# Let's just look at the first 30 lines of a recursive ls
# (And yes, we're looking at pdf2txt)
$ ls -lRAF pdf2txt | head -n 30
pdf2txt:
total 0
drwxr-xr-x+ 5 aho staff 170 Feb 13 20:13 pdf2txt/
-rw-r--r--+ 1 aho staff   0 Feb 13 19:43 test1.txt
-rw-r--r--+ 1 aho staff   0 Feb 13 19:43 test2.txt

pdf2txt/pdf2txt:
total 0
drwxr-xr-x+ 3 aho staff 102 Feb 13 20:13 pdf2txt/
-rw-r--r--+ 1 aho staff   0 Feb 13 20:13 test1.txt
-rw-r--r--+ 1 aho staff   0 Feb 13 20:13 test2.txt

pdf2txt/pdf2txt/pdf2txt:
total 0
drwxr-xr-x+ 3 aho staff 102 Feb 13 20:13 pdf2txt/

pdf2txt/pdf2txt/pdf2txt/pdf2txt:
total 0
drwxr-xr-x+ 3 aho staff 102 Feb 13 20:13 pdf2txt/

pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt:
total 0
drwxr-xr-x+ 3 aho staff 102 Feb 13 20:13 pdf2txt/

pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt:
total 0
drwxr-xr-x+ 3 aho staff 102 Feb 13 20:13 pdf2txt/

pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt/pdf2txt:
total 0
8
Adrian

/Volumes/Mac_Storage/pdf2txt/pdf2txtを指すシンボリックリンク.はありますか?

確認するには、ls -l /Volumes/Mac_Storage/pdf2txtを実行します。

次のような行が表示された場合:

lrwxrwxrwx 1 madmiddle madmiddle 1 Feb 12 12:34 pdf2txt -> .

...それが原因です。

このようなリンクを作成するコマンドはln -s . pdf2txtです。これは、タイプミスの結果として偶発的に発生する可能性がかなり高い場合があります。

6
telcoM

私は本当に退屈で、mbp runnin mojaveのcp manページでこれを見つけました:

互換性cpユーティリティの旧バージョンには-rオプションがありました。この実装はそのオプションをサポートしています。ただし、特殊ファイル、シンボリックリンク、またはfifoを正しくコピーしないため、その使用は強くお勧めしません。

ええ、cp -rはmacOSでは正しく機能しません

2
Salazar