mass mv usando find?

1

há um monte de filename.gif espalhados em / home / diretórios. Eu quero que o nome do arquivo.gif seja substituído por um /home/shared/filename_default.gif.

Eu tentei algo como

find /home/ -name "filename.gif" | xargs <cmd>

mas não faço ideia de referenciar o que quero. Não tinha certeza de pedir isso aqui ou stackoverflow

Editar: Isso funciona exatamente como eu expliquei, exceto que eu não queria apenas que os dados de filename_default substituíssem filename.gif, mas também que filename.gif fosse renomeado filename_default.gif. Então eu fiz mv {} filename_default.gif e mv'ed todos os arquivos de seus diretórios para / root / sob o nome de arquivo filename_default.gif ... lol. existe de qualquer maneira para referenciar a variável de mudança em um diretório ..

por exemplo, find / home / -name "nome_do_arquivo.gif" estava localizado assim ...

/home/brian/dir/1/2/3/filename.gif
/home/beth/dir/1/2/3/filename.gif
/home/andrea/dir/1/2/3/filename.gif

Como posso referenciar brian, beth e andrea ... como um curinga *.

cp /home/shared/filename_default.gif /home/*/dir/1/2/3/filename_default.gif
    
por Dennis Williamson 20.08.2010 / 21:03

3 respostas

1

Que tal isso?

find /home/ -name filename.gif -exec mv -f /home/shared/filename_default.gif {} \;

O sinalizador -exec encontrou um comando em todos os objetos encontrados. O {} indica o nome do arquivo encontrado. Você terá que finalizar o comando shell com \; . Você poderia indiscutivelmente usar ln -s para simbolizar esses .gifs. Isso pode ser mais fácil se você quiser alterar seu .gif compartilhado sem refazer esse tipo de descoberta e movimentação.

EDIT Bons pontos por Denilson abaixo. Apesar da questão envolvendo mv , ele só funcionará uma vez, antes que o arquivo de origem seja removido. (movido) Seu conselho sobre o comando echo é uma boa maneira de checar novamente o que vai acontecer, antes que aconteça.

find /home/ -name filename.gif -exec cp -p /home/shared/filename_default.gif {} \;


- Christopher Karel

    
por 20.08.2010 / 21:10
1
find /home -name filename.gif -type f -printf "%h
find /home -name filename.gif -type f -printf "%h%pre%" | xargs -0 --max-args 1 cp -l  /home/shared/filename_default.gif
" | xargs -0 --max-args 1 cp -l /home/shared/filename_default.gif

Este não é o caractere curinga que você solicitou, mas realiza a primeira parte da tarefa, colocando " filename_default.gif " nos diretórios de destino. Se isso funcionar da maneira desejada, você poderá substituir a parte ' cp -l /home/shared/filename_default.gif ' do comando por ' rm ' e substituir ' -printf "%h-print0" ' por ' /home/shared/filename_default.gif ' para remover o arquivo original.

Isso pressupõe que você deseja obter o conteúdo de filename_default.gif e colocar esse conteúdo em um arquivo chamado ' filename.gif ' em todos os diretórios que contêm ' filename.gif ', removendo ' filename.gif ' (e, portanto, efetivamente substituindo ' filename_default.gif ' arquivos nomeados por uma imagem idêntica em um arquivo chamado ' filename.gif ')

Se você quiser substituir ' -printf "%h-print0" ' mas deixar o mesmo nome, substitua ' rm ' por ' %code% ' e omita a etapa %code% .

    
por 21.08.2010 / 06:43
0

# find -type f -name 'filename.gif' -exec cp -v /home/shared/filename_default.gif {} \;

Isto irá substituir todos os seus arquivos "filename.gif" pelo conteúdo de "filename_default.gif" mas não irá renomear "filename.gif" para "filename_default.gif"

Para renomear use o seguinte comando

# rename 's/filename.gif/filename_default.gif/' $(find -type f -name 'filename.gif')

HTH

    
por 21.08.2010 / 08:40

Tags