ワイルドカードを含む単一引数を持つcp

ワイルドカードを含む単一引数を持つcp

次の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ワイルドカードはではなく拡張されます。cpcp1つのパラメータのみを入力したかどうかはどうすればわかりますか?これはbashワイルドカードの副作用なので、バグとは言えません。

答え2

あなたは何が起こっているのかをよく知っているようです。あなたの例では、あなたが*pdf混乱しfile1.pdf file2.pdf this_is_a_folder.pdfていることを理解していません。やるべきことをやっているときにコピーしてEnterを押すとcp言うと、すぐにそれが行われます。バグがなく、宣伝されたとおりに機能します。file1.pdffile2.pdfthis_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 directorycp *pdf一つ.pdfbefore で終わるファイルは、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。今やめましょうcpfile1.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

関連情報