web-dev-qa-db-ja.com

コピー[cpの使用]の問題

/ mntにいくつかのサブフォルダーがマウントされています。 1つは/ mnt/dataで、もう1つは/ mnt/1804iso/ dataには、別のディスクからマウントされたデータフォルダーとファイルが含まれ、/ 1804isoマウントされたISOファイルが含まれます。その内容は、マウントされたフラッシュドライブであるフォルダー/ media/benny/0EB4-95E2 /にコピーしたいものです。

それで、私はbashを開き、Sudo cp -Rn /mnt/1804iso/.* /media/benny/0EB4-95E2/と入力しました。私は通常、ワイルドカードアスタリスクの前のピリオド/ * /を省略していましたが、その場合、ISO内の隠しファイルはコピーされません。したがって、このコマンドを使用すると、奇妙なことが1つ発生しました。 ISOファイルを正しくコピーした後、/ mnt/dataフォルダーとファイルもコピーし始めました。コマンドパート/mnt/1804iso/.*に対する私の理解に完全に欠陥がない限り、そのフォルダへの参照がないため、なぜそれが起こり得るのかわかりません。

/mnt/dataフォルダがコピー用に含まれている理由を誰かが親切に説明してくれませんか?

5
Paul Benson

.*は、隠しファイル、...に展開されます。これは、Bash ファイル名展開 の動作の不運な部分です。..というディレクトリエントリがあり、最初の.と、その後に続く任意の数の文字で構成されています。 .*と一致して含まれています。

これを実行すると、次のように表示されます。

echo /mnt/1804iso/.*

/mnt/1804iso/./mnt/1804iso/..が残りとともにリストされます。

../datadataディレクトリです。次のような宛先のディレクトリ構造になります。

.hidden
xyz
data/
data/...
1804iso/.hidden
1804iso/xyz
...

つまり、実際には、コピーしたいすべての2つのコピーに加えて、コピーしなかったすべてのものになります。 cp -Rnvを使用すると、コピー先とコピー先が表示されます。

他のいくつかのシェルはこれについてより良いでしょう。 zshでは、それはあなたが望むものに近づいたでしょう:only隠しファイルがコピーされたでしょう。 Bashでは、cp src/.[^.]* destを使用してmostをzshの動作と一致させ、2つのソースの場所をリストできます。あるいは、 -shopt -s dotglobを事前に実行する を実行することもできます。その後、src/*includeドットファイルに展開されますが、exclude.および..エントリ(ただし、これは後で意図しないことを行う可能性があるため、注意してください)。


あなたが実際にやりたかったことについては、代わりに rsync を使用することをお勧めします:

rsync -avx /mnt/1804iso/ /media/benny/0EB4-95E2/

これにより、隠しファイルを含め、1804isoディレクトリのcontentsが宛先(最後のスラッシュに注意!)にコピーされます。

9
Michael Homer

パターン/mnt/1804iso/.*は、とりわけ、/mnt/1804iso/..と同じディレクトリエントリ/mntに拡張されます。それが/mnt/dataのコピーを開始した理由です。

この場合、rsyncを使用します。

rsync -ai /mnt/1804iso/ /media/benny/0EB4-95E2

これにより、隠しファイルを含むすべての/mnt/1804iso/media/benny/0EB4-95E2にコピーされます。ソースディレクトリの末尾の/を省略すると、ターゲットディレクトリの下に1804isoディレクトリが作成されます。

または、dotglobbashシェルオプションをshopt -s dotglobで有効にして、*が非表示の名前だけでなく非表示の名前にも一致するようにします(ただし.はできません)または..)。次に使用します

cp -Rn /mnt/1804iso/* /media/benny/0EB4-95E2/
3
Kusalananda