Como agrupar arquivos cp e renomear adicionando o prefixo no diretório atual em uma linha de comando sem usar o loop?

1

Exemplo:

.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4

4 directories, 6 files

Eu quero copiar f1.md/f2.md/f3.md no diretório atual e os resultados serão t-f1.md/t-f2.md/t-f3.md . (prefixo é t- )

Tentando e Esperança:

for file in *md;do cp -a $file t-$file;done obterá resultado, mas parece muito longo usando for loop. Espero que haja um comando mais curto e simples para obter os mesmos resultados.

    
por Jack 05.11.2017 / 10:33

3 respostas

2

O caminho mais curto com o GNU parallel :

parallel --no-notice 'cp "{}" "t-{}"' ::: *.md

link

    
por 05.11.2017 / 10:58
1

Para copiar os arquivos, o loop que você já tem é o caminho mais curto para fazê-lo. Se você quiser fazer isso sem o loop, você pode combinar cp rename e mv

mkdir tmp
cp -a *.md tmp
(cd tmp && rename '' 't-' tmp/*.md)
mv temp/*.md .

Isto reduz os comandos que você tem que executar (somente um comando cp contra um para cada arquivo), isto pode ou não tornar o programa mais rápido para executar - você precisaria fazer benchmark dele. Mas falhará se você tiver um número muito grande de arquivos quando passarmos todos os arquivos para cp rename e mv .

    
por 05.11.2017 / 10:58
0

com mmv / mcp :

mcp '*.md' t-#1.md

dado

$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4

0 directories, 10 files

Então

$ mcp -v '*.md' t-#1.md
f1.md -> t-f1.md : done
f2.md -> t-f2.md : done
f3.md -> t-f3.md : done

resultando em

$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
├── s4
├── t-f1.md
├── t-f2.md
└── t-f3.md

0 directories, 13 files
    
por 05.11.2017 / 15:03