Mover arquivos e renomear usando uma parte da estrutura de diretórios e uma parte do nome do arquivo atual

2

Então, aqui está o caminho atual:

../CAMERA3/serialnum/2016-12-19/001/dav/07/07.02.53-07.03.14[M][0@0][0].dav

aqui objetivo final:

../CAMERA3/2016-12-19_07.02.53-07.03.14.dav

Então, basicamente, estou tentando descobrir um loop for que extraia alguns dos nomes de diretório e parte do nome do arquivo da seguinte forma:

mv ../$dir1/$dir2/$dir3/$dir4/$dir5/$dir6/$filenameportion[M][0@0][0].dav ../$dir1/$dir3_$filenameportion.dav
    
por Paul M 01.01.2017 / 02:28

2 respostas

2

Acabou tendo que usar rnm . Meio feio mas funciona:

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    if [[ $(basename "$filename") != C*.dav ]];then
        find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
    fi
done' find-sh {} \;

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    rename "[M][0@0][0]" "" "$filename" 
done' find-sh {} \;

find /mnt/test -name '*.dav' -type f -execdir sh -c 'mv "$@" ./../../../../..' find-sh {} \;

PS: Sim, eu sou os dois usuários. Originalmente postei como convidado e segui o link do e-mail para criar uma conta. Surpreso, não foi automático. Desculpe por confusão de barras invertidas, arquivos copiados para o windows laptop, esqueci de mudar de volta para postar.

Atualização 1: remoção do loop encontrado na saída de achados

    
por 02.01.2017 / 01:51
0

Melhorando a resposta de Pauls :

O seguinte código:

find /mnt/test -name '*.dav' -exec sh -c 'for filename do 
    if [[ $(basename "$filename") != C*.dav ]];then
        find "$filename" -type f -execdir ~/bin/rnm -y "$filename" -ns '/pd05/_/pd03/_/n/.dav' \;
    fi
done' find-sh {} \;

Pode ser otimizado assim (sem qualquer find ou for loop):

rnm -y -ns '/pd5/_/pd3/_/n/.dav' -ss '^[^C].*\.dav$' -fo -dp -1 /mnt/test

Explicação:

-ss : string de pesquisa (regex). A regex usada acima procura por arquivos que terminem com .dav e não iniciem com C .

-fo : modo somente arquivo.

-dp : profundidade. -1 significa profundidade ilimitada, por exemplo, para todos os subdiretórios.

-ns : string de nome (novo nome)

/pd<digit>/ : Uma regra de cadeia de nomes que implica diferentes níveis de nomes de diretórios pai: 0 é o pai imediato, 1 é acima disso e assim por diante.

/n/ : Outra regra de sequência de nomes que implica o nome do arquivo sem extensão. /n/.dav pode ser substituído por /fn/ (nome completo).

-y : confirme ( --yes ) para todos.

    
por 16.02.2017 / 14:54