mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
これはtest_dir3にのみコピーされ、test_dir、test_dir1、test_dir2にはコピーされません。どうして?
さらに言えば、test_dir4などの最新のディレクトリにのみコピーされ、他のディレクトリにはコピーされません(省略されています)。
これらの3つのコマンドがあります
mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/
例が始まる前に.
に他のファイルやディレクトリがないと仮定すると、その最後の行のワイルドカードは次のように展開されます。
cp -v file1 file2 file3 test_dir/ test_dir1/ test_dir2/ test_dir3/
(これは、cp
をecho cp
に変更し、結果を観察することで確認できます。)cp -v
によって生成された診断メッセージは、何を試みているかを示しています。つまり、コマンドラインのすべての項目をコピーしますが、最後の項目は最後の項目にコピーします。したがって、これはディレクトリである必要があります。
‘file1’ -> ‘test_dir3/file1’
‘file2’ -> ‘test_dir3/file2’
‘file3’ -> ‘test_dir3/file3’
cp: omitting directory ‘test_dir/’
cp: omitting directory ‘test_dir1/’
cp: omitting directory ‘test_dir2/’
cp
コマンドが機能するからです。 2つ以上の引数がある場合、最後の引数はディレクトリである必要があり、その前のすべての引数がにコピーされます。
Windowsのcp
コマンドのように動作するcopy
が必要だと思います。そうです、そのようなツールは広く使用されていませんが、あります。私でさえそのためにグーグルしなければなりませんでした。
実際の目標は、単純なループで簡単に達成できます。
for i in test_dir*; do cp -v test_file* $i; done
最初の場所にあるように、はるかに単純です。 Bashは実際には基本的なプログラミング言語であり、UNIX環境で1行のコマンドでループやさらに複雑な操作を行うことは非常に一般的です。