Estou usando o macOS e tentando executar os seguintes comandos no Bash:
cd root || exit
shopt -s dotglob
for d in ./*
do
if [ -d "$d" ]
then
find "$d" -type f -exec mv -i -t "$d" {} +
find "$d" -mindepth 1 -type d -delete
fi
done
O mv
comando no macOS não permite que -t
o sinalizador especifique o diretório e apresenta o seguinte erro:
mv: illegal option --t
usage: mv [-f | -i | -n] [-v] source target
Como fazer isso no macOS?
Sem
-t
, você deve manter o diretório de destino como o último argumento não opcional paramv
. Isso nos dá duas opções:find
colocar o nome do arquivo antes do diretório de destino paramv
, ou encontrar outra coisa que possa fazer a mesma coisa. Então, ou:Ou:
No primeiro comando,
mv
é executado para cada arquivo. No segundo,sh -c ...
é executado para um lote de arquivos, que por sua vez é executadomv
para todo o lote. A segunda opção pode ser muito mais rápida, mas como você está usando a confirmação interativa, não importa muito.não tem nada a ver com bash. É o
mv
comando.Você pode instalar gnu
mv
, para obter a-t
opção. Como alternativa, veja outras respostas, mas com este conselho extra.A página man mostra esses dois modos (eu removi o
-t
modo)Você pode notar que se você não especificar o
-T
(também, eu acho, apenas no Gnu mv), e tiver dois argumentos, então a gramática é ambígua. A ambiguidade é resolvida examinando o último arquivo. Se for um diretório, então é a 2ª forma, senão é a 1ª forma. A gramática pode ser tornada não ambígua colocando um/
após o nome do diretório, forçando assim a 2ª forma. Isso vai parar muitos erros. Infelizmente, a única maneira de desambiguar a 1ª forma é com o-T
.