Se você precisar renomear todos arquivos cujo nome contém \
, você pode fazer:
for file in *\*; do
dir="$(dirname -- "${file//\/\/}")"
filename="${file##*\}"
mkdir -p -- "$dir"
mv -- "$file" "$dir"/"$filename"
done
Explicação
-
for file in *\*
: O glob*\*
corresponde a qualquer nome de arquivo ou diretório no diretório atual cujo nome contenha\
. Como o\
também é o caractere de escape, precisamos evitá-lo para que seja tratado como um literal. É por isso que não podemos usar apenas*\*
.Em seguida, iterará todos os arquivos e diretórios cujo nome contenha
\
, salvando cada um deles como$file
. -
dir="$(dirname "${file//\/\/}")"
:${file//\/\/}
imprimirá o nome do arquivo atual com todos os\
substituídos por/
. O escape\
e\/
) é necessário, pois os caracteres\
e/
são especiais.dirname
imprime o diretório no qual um arquivo está contido. Por exemplo,dirname /path/to/file
retornará/path/to
. Portanto,$dir
será o diretório de destino para o qual moveremos este arquivo. -
filename=${file##*\}
: o nome do arquivo, com tudo antes do último\
removido. Este é o nome real do arquivo e será salvo como$filename
. -
mkdir -p "$dir"
: crie o diretório de destino e todos os seus pais. O-p
tornamkdir
criar os diretórios pais (sem quemkdir foo/bar
não funcione, a menos quefoo/
já exista) e também ignora os erros sobre o diretório já existente. -
mv "$file" "$dir"/"$filename"
: a etapa final, mova o arquivo para o local correto.