次の2つのファイルと1つのフォルダがある場合:
someuser@computer:~/Desktop/test$ ls -l
total 340
-rw-r--r-- 1 someuser someuser 45082 ago 5 09:56 file1.pdf
-rw-r--r-- 1 someuser someuser 291836 ago 5 09:56 file2.pdf
drwxrwxr-x 2 someuser someuser 4096 ago 5 09:56 this_is_a_folder.pdf
次のコマンドを実行します(ターゲットは省略しました)。
cp *.pdf
file1.pdf
そしてフォルダfile2.pdf
にコピーしました。this_is_a_folder.pdf
someuser@computer00:~/Desktop/test$ ls this_is_a_folder.pdf/
file1.pdf file2.pdf
明らか*.pdf
に一致するように拡張されるので、次のようになります。
cp file1.pdf file2.pdf this_is_a_folder.pdf
...this_is_a_folder.pdf
フォルダに2つのファイルをコピーします。
これはバグですか?
これは明らかにワイルドカード拡張の副作用であり、予想したものとは異なります。
私は予想したmissing destination file
間違い。
答え1
cp
これはコマンドのバグではありません。と入力すると、cp *.pdf
実際のcp
ワイルドカード文字は表示されません。bash
ワイルドカードはではなく拡張されます。cp
。cp
1つのパラメータのみを入力したかどうかはどうすればわかりますか?これはbashワイルドカードの副作用なので、バグとは言えません。
答え2
あなたは何が起こっているのかをよく知っているようです。あなたの例では、あなたが*pdf
混乱しfile1.pdf file2.pdf this_is_a_folder.pdf
ていることを理解していません。やるべきことをやっているときにコピーしてEnterを押すとcp
言うと、すぐにそれが行われます。バグがなく、宣伝されたとおりに機能します。file1.pdf
file2.pdf
this_is_a_folder.pdf
フォルダ名が で終わるので.pdf
に含まれ、*.pdf
フォルダで最後の引数(アルファベット順にソート)なので、ファイルがcp
フォルダにコピーされます。予想される動作を得るには、ワイルドカードをcp
表示する前に拡張されないように、シェルからワイルドカードを保護する必要があります。
$ cp "*pdf"
cp: missing destination file operand after `*pdf'
Try `cp --help' for more information.
この場合、ワイルドカードは拡張されないため、cp
実際にはというファイルを探しています。したがって、ディレクトリを最後の引数()として使用して呼び出して*.pdf
も。また、以下を含むディレクトリで試してみると、予想される動作を確認できます。cp "*.pdf" foo/
cannot stat '*.pdf': No such file or directory
cp *pdf
一つ.pdf
before で終わるファイルは、1 つの引数*.pdf
だけを持つように拡張されます。
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file1.pdf
$ cp *pdf
cp: missing destination file operand after `file1.pdf'
Try `cp --help' for more information.
また、これと比較してください:
$ ls -l
total 0
drwxr-xr-x 1 terdon terdon 0 Aug 5 16:56 a_folder.pdf
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file1.pdf
-rw-r--r-- 1 terdon terdon 0 Aug 5 16:56 file2.pdf
$ cp *pdf
cp: target `file2.pdf' is not a directory
ここではフォルダ名がで始まるので、次のようa
に*.pdf
展開されます
a_folder.pdf file1.pdf file2.pdf
。したがって、cp
実際のコマンドの実行は次のようになります。
cp a_folder.pdf file1.pdf file2.pdf
最後のパラメータがディレクトリではないため、エラーを返します。
答え3
他の回答ですでに指摘したように、bashはワイルドカードを展開し、表示される内容をに渡しますcp
。今やめましょうcp
。file1.pdf file2.pdf this_is_a_folder.pdf
- ワイルドカード文字を使用しないでください。
-t
スイッチを使用し--target-directory
てターゲットを指定します。常にワイルドカードを使用した後、ターゲットを最後に宣言してください。
cp *.pdf /I/want/to/copy/files/here
答え4
引数の最後の部分がディレクトリの場合、cp
指定されたファイルはそのディレクトリにコピーされます。ディレクトリ名を指定したかどうかは問題ではありませんfoo.pdf
(なぜその名前ですか?!)。ワイルドカード拡張は、ファイルタイプではなくファイル名(またはディレクトリ名)に基づいています。
2つのパラメータを使用すると、ターゲットはファイルまたはディレクトリになります。ファイルの場合、ターゲットファイルは削除され、ソースファイルのコピーに置き換えられます。宛先がディレクトリの場合、ソースファイルのコピーはそのディレクトリに配置されます。与えられた概要の1つを参照してください。
cp [OPTION]... [-T] SOURCE DEST
3つ以上の引数がある場合、ターゲットはディレクトリとして扱われます。
cp [OPTION]... SOURCE... DIRECTORY