
Olá, quero remover todas as barras de todos os meus arquivos, mas faça isso recursivamente para cada diretório em um diretório principal.
Como devo modificar esse script, que funciona de forma não recursiva?
for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done
ou melhor, quero substituir apenas uma barra nos nomes de arquivos, mas isso para cada subpasta na pasta principal?
saudação Max
Responder1
Na camada BSD, uma barra é o separador de caminho. Quando você encontra um nome de arquivo com uma barra, o kernel converte a barra- /
em dois pontos- :
. Portanto, um nome de arquivo no aplicativo localizador pode parecer, foo/bar
mas na camada BSD parece foo:bar
.
Portanto, para percorrer a árvore de diretórios, use find
para localizar os arquivos :
em seus nomes. Em seguida, use um script embutido para -execdir
remover os dois pontos (barras no aplicativo localizador) dos nomes dos arquivos.
find . -type f -name '*:*' -execdir bash -c ' for file
do
echo mv -- "${file}" "${file//:}"
done' sh {} \;
Isso listará apenas o mv
comando e os operandos. Se você acha que a saída fornecerá os resultados desejados, remova o arquivo echo
.