Como cp apenas para o nome do diretório mais recente?

2
mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/

Isso copia apenas para test_dir3 e não em test_dir, test_dir1, test_dir2. Por quê?

Por isso, copia apenas para o diretório mais recente, digamos, test_dir4 e não para nenhum outro diretório (está omitindo-os).

    
por kumar 18.03.2015 / 10:25

2 respostas

3

Você tem esses três comandos

mkdir test_dir test_dir1 test_dir2 test_dir3
touch file1 file2 file3
cp -v file* test_dir*/

Supondo que não haja outros arquivos ou diretórios em . antes do início do exemplo, os curingas da última linha serão expandidos assim:

cp -v file1 file2 file3 test_dir/ test_dir1/ test_dir2/ test_dir3/

(Você pode ver isso alterando cp para echo cp e observando o resultado.) O que você não nos disse são as mensagens de diagnóstico produzidas por cp -v , que mostram o que está tentando fazer, ou seja, copie cada item na linha de comando, mas o último no último item, que deve, portanto, ser um diretório:

‘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/’
    
por 18.03.2015 / 10:46
2

Porque os comandos cp funcionam assim. Se ele tiver mais de 2 argumentos, o último argumento deve ser um diretório e todos os argumentos antes disso serão copiados para.

Eu acho que você quer um cp que se comporte muito mais como o comando windows copy , e sim, existem essas ferramentas, embora elas não sejam amplamente usadas. Até eu tive que procurar no Google.

Seu objetivo real pode ser facilmente alcançado por um simples loop:

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

É muito mais simples do que parece no primeiro lugar. O Bash é na verdade uma linguagem de programação básica, e fazer loops ou operações ainda mais complexas em comandos de linha única em um ambiente unix é bastante comum.

    
por 18.03.2015 / 10:44

Tags