Recorte um campo em uma string com bash

3

Eu preciso abaixar todas as maiúsculas de nomes de arquivos e pastas de um caminho, recursivamente dentro de outras pastas encontradas; Eu preciso fazer isso com um script bash.

Aqui meu código:

for file in $(find $1 -type f)
do
    tmp=$(echo $file | rev | cut -d/ -f1 | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
    tmp2=$(echo $file | rev | cut ????)
    tmp=$tmp$tmp2
    mv $file $(echo $tmp | rev)
done
for file in $(find $1 -type d | sort -r)
do
    tmp=$(echo $file | rev | cut -d/ -f1 | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
    tmp2=$(echo $file | rev | cut)
    tmp=$tmp$tmp2
    mv $file $(echo $tmp | rev)
done

O problema está na linha 4, [ tmp2=$(echo $file | rev | cut ????) ]  Não sei como posso selecionar todos os campos delimitados com / após o primeiro campo.

Com a linha 3 eu posso isolar o nome do arquivo e com o comando tr modificar todas as maiúsculas, mas depois vem o problema. O mesmo para as pastas t a segunda construção 'for'.

    
por Lamberto Basti 29.11.2013 / 18:29

3 respostas

3

Você deve estar usando dirname e basename em vez desses truques com rev e cut

declare -l file_lower   # anything assigned to this varname will be lower-cased

find $1 -type f | while read -r file
do
    file_lower=$(basename "$file")
    dir=$(dirname "$file")
    mv "$file" "$dir/$file_lower"
done

find $1 -type d | sort -r | while read -r file
do
    file_lower=$(basename "$file")
    dir=$(dirname "$file")
    mv "$file" "$dir/$file_lower"
done
    
por 29.11.2013 / 19:48
2

cut -d/ -f 2-

O corte suporta intervalos para seu parâmetro de deslocamento, por exemplo, -f 2- , -c -2 , -b 1-3

    
por 29.11.2013 / 19:22
1

Em um sistema GNU:

find . -depth -name '*[[:upper:]]*' -printf '%h
autoload zmv
zmv -n -wQ '**/*(D)' '$1${(L)2}'
%f
find . -depth -name '*[[:upper:]]*' -printf '%h
autoload zmv
zmv -n -wQ '**/*(D)' '$1${(L)2}'
%f%pre%' | awk -v RS='%pre%' '{getline f; printf "%s%pre%%s%pre%", $0"/"f, $0"/"tolower(f)}' | xargs -r0n2 echo mv
' | awk -v RS='%pre%' '{getline f; printf "%s%pre%%s%pre%", $0"/"f, $0"/"tolower(f)}' | xargs -r0n2 echo mv

(remova echo quando feliz).

Ou se você puder usar zsh :

%pre%

(remova -n quando estiver satisfeito)

    
por 29.11.2013 / 22:19

Tags