Como mover arquivos com nome contendo vários caracteres especiais como 'é' 'ä' 'espaço'?

Como mover arquivos com nome contendo vários caracteres especiais como 'é' 'ä' 'espaço'?

Estou tentando mover meus arquivos do diretório atual para outro diretório. O problema que estou tendo é que vários arquivos têm um nome com caracteres especiais como space, ü, &, (, .... Como posso mover todos os meus arquivos usando um comando como: ls | grep mp4 | xargs -i mv {} mp4, onde {}deveria ser o nome do arquivo atual e mp4 o destino colocar todo o meu arquivo. Eu tentei o comando, mas ele mostra erros. Você pode por favor ajudar ?

Responder1

Esta é exatamente a situaçãovocê não quer usarlsou xargscom as configurações padrão, ele dividirá a entrada em espaços e lidará especialmente com aspas e barras invertidas. Você precisaria usar -0para separar a entrada em bytes nulos ou -d'\n'para separar em novas linhas (GNU xargs) para desativar esse comportamento.

Como todos os arquivos estão no mesmo diretório, você pode simplesmente usar o shell:

mv *mp4* mp4/

Ou mv *.mp4 mp4/se você quis dizer apenas arquivos que possuem mp4como extensão. O primeiro alertaria sobre a mudança mp4para mp4.)


Se os arquivos não estivessem no mesmo diretório, você precisaria usar o asterisco duplo ( zsh- ativado por padrão ou kshcom set -o globstarou bashcom shopt -s globstar):

mv **/*mp4* mp4/

oufind

find . -type f -name "*mp*" -exec mv {} mp4/ \;

Responder2

O comando:

ls | grep mp4 | xargs -i mv {} mp4

pode na maioria dos casos ser substituído pelo mais simples e robusto:

mv *mp4* mp4

Você pode ignorar o aviso sobre o diretório mp4 não poder ser movido dentro dele.

Observe que este script, como o seu, está movendo todos os arquivos com " mp4" aparecendo em qualquer lugar do nome (por exemplo: mp4list.txt, lamp4.jpg). Se você realmente deseja mover apenas arquivos com a extensão " .mp4", você pode usar:

mv *.mp4 mp4

mp4Isso evitaria que ocorresse a situação que leva à mensagem de erro sobre o próprio diretório .

Se o número de arquivos mp4 for enorme e impedir que o comando anterior funcione, você pode usar o GNU findpara conseguir o mesmo:

find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +

ou

find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +

informação relacionada