Crie cópias de arquivos no mesmo diretório

1

Digamos que eu tenha um diretório com os seguintes arquivos:

1.txt 2.txt 3.txt

Eu quero copiar estes e basicamente colar no mesmo diretório fazendo novos arquivos, por exemplo:

1.txt 1(1).txt 2.txt 2(1).txt 3.txt 3(1).txt

Isso é mais difícil do que eu pensava! Isso parece trivial no Windows, basta destacar um monte de arquivos, copiar / colar, e cria os mesmos arquivos, mas adiciona 'Copiar' no nome.

    
por bk201 04.02.2015 / 07:03

4 respostas

3

No estilo simples do Unix, você precisa fazer um loop pelos arquivos:

for file in 1.txt 2.txt 3.txt; do cp -pi "$file" "${file%.*}(1).txt"; done

${file%.*} remove a extensão do nome do arquivo e, em seguida, (1).txt adiciona o número e restaura a extensão. As opções para cp avisam se já existe um destino ( -i ) e preservam as permissões ( -p ).

A maioria dos sistemas Linux terá o pacote mmv disponível; que permite que você simplesmente faça

mcp '*.txt' '#1(1).txt'

Isso copia todos os arquivos que terminam em .txt para um novo arquivo, correspondendo ao primeiro curinga ( #1 ) e anexando (1).txt . Os parênteses não precisam de escapar aqui porque estão entre aspas.

Como alternativa, se você usar um gerenciador de arquivos gráficos, poderá fazer exatamente o mesmo que faria no Windows.

    
por 04.02.2015 / 07:25
1

This seems trivial on Windows, just highlight a bunch of files

Eu acho que é trivial em vários gerenciadores de arquivos GUI no Linux também, mas você precisa de uma solução shell, certo? Aqui está:

for F in *; do cp -p "$F" "${F%.*}\(1\).${F#*.}"; done

${F%.*} extrai parte do nome do arquivo antes do ponto, enquanto ${F#*.} extrai a extensão.

    
por 04.02.2015 / 07:24
1
set ./*.txt
while    [ -e "$1" ] || [ -L "$1" ]
do       case ${1##*(} in ($1|*[!0-9]*\)|\)*)
         cp "$1" "${1%.*}(1).txt";;
         (*\)*) set "${1##*(}" "$@"; cp \
         "$2" "${2%"$1"}$((${1%)*}+1))).txt"
         shift;; esac
shift;   done

Isso deve lidar com todos os casos muito bem, eu acho. Ele irá incrementar o número (cópia) se necessário - mas caso contrário, apenas insira um (1) entre a extensão e o nome do arquivo.

    
por 04.02.2015 / 08:20
1

Em zsh , a movimentação ou cópia de curinga é enviada com o shell:

autoload zmv
zmv -C '(*).txt' '$1 (1).txt'

Mas eu realmente aconselho a não usar um espaço em um nome de arquivo para esse propósito, e parênteses também não são ideais. Eu menciono isso porque toda vez que encontro um padrão como esse (por exemplo, x.txt e x (1).txt e x (2).txt ) e quero concluir a tabulação sem aspas duplas, eu tenho que escrever x <tab> <backslash> <space> <backslash> ( 1 <tab> para acertar. Além disso, parece confuso na saída ls porque não está realmente claro onde os nomes de arquivos terminam. Eu usaria x.txt , x.1.txt e x.2.txt . Dessa forma, os nomes de arquivos aparecem visualmente como unidades únicas, e essa conclusão funciona: x <tab> .1 <tab> .

    
por 04.02.2015 / 10:55

Tags