web-dev-qa-db-ja.com

最新のディレクトリ名のみにcpする方法は?

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などの最新のディレクトリにのみコピーされ、他のディレクトリにはコピーされません(省略されています)。

2
kumar

これらの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/

(これは、cpecho 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/’
4
roaima

cpコマンドが機能するからです。 2つ以上の引数がある場合、最後の引数はディレクトリである必要があり、その前のすべての引数がにコピーされます。

Windowsのcpコマンドのように動作するcopyが必要だと思います。そうです、そのようなツールは広く使用されていませんが、あります。私でさえそのためにグーグルしなければなりませんでした。

実際の目標は、単純なループで簡単に達成できます。

for i in test_dir*; do cp -v test_file* $i; done

最初の場所にあるように、はるかに単純です。 Bashは実際には基本的なプログラミング言語であり、UNIX環境で1行のコマンドでループやさらに複雑な操作を行うことは非常に一般的です。