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 usarls
ou xargs
com as configurações padrão, ele dividirá a entrada em espaços e lidará especialmente com aspas e barras invertidas. Você precisaria usar -0
para 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 mp4
como extensão. O primeiro alertaria sobre a mudança mp4
para mp4
.)
Se os arquivos não estivessem no mesmo diretório, você precisaria usar o asterisco duplo ( zsh
- ativado por padrão ou ksh
com set -o globstar
ou bash
com 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
mp4
Isso 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 find
para conseguir o mesmo:
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
ou
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +