Renomeie arquivos recursivamente [duplicado]

1

Sou bastante novo no Linux, portanto, poderia ajudar um pouco.

Se houver uma maneira de fazer isso funcionar para todo o conteúdo do subdiretório em vez de apenas para o diretório atual?

for f in *\ *; do mv "$f" "${f// /_}"; done
    
por Lee 10.05.2018 / 11:59

1 resposta

0

com zsh :

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)' '$1${2// /_}'

Como em seu código, ele não renomeia arquivos ocultos. Ele não olha dentro de diretórios ocultos também. Se você quiser renomeá-los, altere para:

autoload zmv # best in ~/.zshrc
zmv '(**/)(* *)(#qD)' '$1${2// /_}'

O bash equivalente (mas sem as salvaguardas fornecidas por zmv , portanto, talvez você queira adicionar uma opção -i a mv ) dessa última seria:

LC_ALL=C find . -depth -name '* *' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

Não existe um equivalente fácil do primeiro, pois não é possível combinar -prune (que seria necessário não descer em diretórios ocultos) e -depth . Um funcionalmente equivalente poderia, no entanto, ser escrito como:

LC_ALL=C find . -depth -name '* *' ! -path '*/.*' -exec bash -c '
  for file do
    base=${file##*/}
    mv -i -- "$file" "${file%/*}${base// /_}"
  done' bash {} +

Ele iria descer em dirs ocultos, mas não renomear arquivos lá.

    
por 10.05.2018 / 12:10

Tags