Como copiar recursivamente e alterar nomes de arquivos para serem exclusivos

4

Eu tenho uma grande árvore contendo muitas fotos em uma unidade externa que foi formatada com um dos tipos de sistema de arquivos linux (não me lembro qual deles). É montado no meu mac e estou tentando copiar as fotos, mas parece que existem arquivos chamados 'somePic.jpg' e 'somePic.JPG'. Quando tento copiá-los, o OSX reclama que existem nomes duplicados e termina. Como posso copiá-los enquanto garanto que os nomes dos arquivos sejam exclusivos? Eu não posso simplesmente renomear qualquer dupes na árvore de fontes primeiro porque o OSX montou a unidade somente para leitura.

Eu toquei em w / cp, gcp, sed e xargs por algumas horas, mas não consegui fazer nada funcionar.

    
por Stinky 20.07.2015 / 18:15

3 respostas

3

... por seu comentar a questão ...

pax -rws'/\.JPG$/.CAP&/' /root/of/copied/tree /dest/path

Se .jpg e .JPG forem seus únicos problemas, isso deve funcionar.

Você também pode adicionar uma primitiva p rint à substituição do nome do arquivo para obter uma lista de todos os nomes de arquivos que foram alterados:

pax -rws'/\.JPG$/.CAP&/p' /root/of/copied/tree /dest/path

Por mais que eu saiba, pax já deve estar instalado em um sistema OSX, e isso deve representar uma solução bastante livre de estresse.

Se os problemas se tornarem mais profundos, afinal, também pode ser interessante para você que pax suporte ...

-i

Interactively rename files or archive members. For each archive member matching a pattern operand or each file matching a file operand, pax will prompt to /dev/tty giving the name of the file, its file mode, and its modification time. pax will then read a line from /dev/tty. If this line is blank, the file or archive member is skipped. If this line consists of a single period, the file or archive member is processed with no modification to its name. Otherwise, its name is replaced with the contents of the line. pax will immediately exit with a non-zero exit status if EOF is (CTRL+D) encountered when reading a response or if /dev/tty cannot be opened for reading and writing.

    
por 20.07.2015 / 21:40
1

Aqui está uma breve tentativa:

# for f in $( find yoursourcedirectory -name \*.jpg ) ; do cp ${f} yourtargetdirectory/${f}.CAP1.jpg ; done

então

# for f in $( find yoursourcedirectory -name \*.JPG ) ; do cp ${f} yourtargetdirectory/${f}.CAP2.jpg ; done

Isto irá pegar todos os arquivos com o nome * .jpg na fonte e copiá-los como * .CAP1.jpg e todos os arquivos * .JPG como * .CAP2.jpg

Outra abordagem seria usar o diffmerge: link

ainda outro (se houver muitos arquivos tentando usar o mesmo nome) é atribuir um nome aleatório para cada arquivo:

# for f in $( find yoursourcedirectory -iname \*.JPG ) ; do cp ${f} yourtargetdirectory/$(dd if=/dev/random count=20 2>&1 /dev/null |md5).jpg ; done

(note que a opção -iname faz o caso de pesquisa insensível, então * .JPG e * .jpg serão encontrados)

    
por 20.07.2015 / 20:16
0

Uma maneira de fazer isso, supondo que você tenha (1) um grep inteligente o suficiente para ler padrões de stdin , (2) um shell inteligente o suficiente para manipular <(...) constructs, (3) rename o pacote Unicode::Tussle Perl e (4) uma coleção de arquivos sem novas linhas em seus nomes:

cd /path/to/pics
ls -1 | tr A-Z a-z | sort | uniq -d | fgrep -ixf - <(ls -1) | \
    rename -n 's/(?=\.[^.]+$)/"_".int(rand(32767))/e'

Isso renomeia os arquivos no lugar, no sistema de arquivos com distinção entre maiúsculas e minúsculas. Primeiro mostra o que vai fazer. Se estiver satisfeito com os resultados, você pode descartar a opção -n de rename , e o comando realmente renomeia os arquivos (não será possível imprimir nada dessa vez).

Existe uma pequena chance de você ainda ter conflitos depois disso. Você pode verificar com este comando:

cd /path/to/pics
ls -1 | tr A-Z a-z | sort | uniq -d

Se ele retornar alguma coisa, você poderá executar o comando novamente mais algumas vezes, até que não haja mais duplicatas. Então você pode mover todo o grupo no seu disco OSX.

    
por 20.07.2015 / 20:00

Tags