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.dirnameimprime o diretório no qual um arquivo está contido. Por exemplo,dirname /path/to/fileretornará/path/to. Portanto,$dirserá 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-ptornamkdircriar os diretórios pais (sem quemkdir foo/barnã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.