Eu tenho uma pasta com vários arquivos nela ABC. * (Existem aproximadamente 100 desses arquivos). Quero duplicar todos eles em novos arquivos com nomes começando com DEF. *
Então eu quero
ABC.Page1
ABC.Page2
ABC.Topic12
...etc
copiado para
DEF.Page1
DEF.Page2
DEF.Topic12
...etc
Qual é a maneira mais simples de fazer isso com um comando em lote (no BASH ou similar)? Estou pensando em algo que envolva sed ou awk ou xargs, mas estou tendo dificuldades para descobrir a sintaxe. Eu poderia escrever um script Python, mas acho que provavelmente existe uma solução de linha de comando que não é muito complicada.
mc
gerenciador de arquivos tem um suporte mais amplo para esse tipo de renomeação em massa.tar
também não é uma galinha da primavera. Veja minha resposta para um exemplo.Respostas:
Que tal algo assim no bash:
você pode testá-lo colocando echo na frente do comando cp:
fonte
cp /usr/local/lib/libboost* /usr/local/lib/libboost*
com a verificação de eco.Para fazer isso de maneira eficiente com um grande número de arquivos, é melhor evitar o início de um
cp
processo diferente para cada um. Uma maneira seria copiar e renomeá-los usandoprename
(rename
está vinculado a isso por padrão nas distribuições baseadas no Debian). Usando isso e o Linuxmktemp
:Atualizar
Na verdade,
pax
pode ser uma maneira melhor de ir aqui:Infelizmente, apesar de
pax
serem POSIX e Linux Standard Base, poucas distribuições atualmente o incluem por padrão.fonte
tar
fará isso por você muito rápido.TESTE
Primeiro, criei 2 diretórios e 10 arquivos:
Então eu os copiei:
TRANSFORMAR
Portanto, o GNU
tar
aceitará umsed --transform=EXPRESSION
para renomear arquivos. Isso pode até renomear apenas alguns dos arquivos. Por exemplo:Então essa é uma vantagem.
CORRENTE
Considere também que são apenas dois
tar
processos - e que não serão alterados independentemente da sua contagem de arquivos.tar
é tão otimizado quanto você gostaria que fosse. Isso nunca terá contagens de argumentos de problemas ou processos filhos em fuga. Isso é apenas A> B feito.ARGUMENTOS
Eu uso 7 argumentos distintos combinados entre meus dois
tar
processos aqui. O mais importante é listado aqui primeiro:... e do outro lado da
|pipe
...fonte
pax
solução para esta pergunta. Gostaria de acrescentar que a minha resposta, mas eu acho que é mais adequado aqui -pax -rws '/^ABC/DEF/' ABC.* .
pax
é POSIX especificado - daí opax
.pax
pode ser POSIX, mas raramente é instalado por padrão, infelizmente.Se você não se importa em usar uma ferramenta menos padrão, recomendo usar mmv (movimento em massa), que foi escrito para esse tipo de tarefa. Usando
mcp
(cópia em massa), que faz parte do pacote, você pode simplesmente fazerNão é exatamente fácil encontrar pacotes de download. O pacote Debian atual (que o Arch também usa no AUR) para compilar em casa pode ser encontrado aqui .
fonte
apt-get install mmv
No zsh, coloque as seguintes linhas no seu
.zshrc
:Em seguida, na linha de comando, você pode executar
ou simplesmente
Em outro shell, desde que você tenha o zsh instalado:
fonte
Você pode fazer isso:
fonte
"${i#*.}"
?Você pode fazer isso: http://www.projectik.eu/index.php/programovanie/linux/item/243-linux-kopirovanie-suborov-vo-vlakne Aqui está um exemplo
fonte