Mova todos os arquivos em subdiretórios para o diretório atual enquanto renomeia os duplicados

2

Eu tenho um número de subdiretórios e gostaria de mover qualquer arquivo contido nele para o diretório atual usando um comando Terminal de uma linha no Mac. Eu sei que os nomes dos meus arquivos não são todos exclusivos e gostariam de adicionar um sufixo antes da extensão do arquivo.

Encontrei uma pergunta semelhante P: Mover todos os arquivos de sub-diretórios para o diretório atual? que sugere usar:

find ./*/* -type f -print0 | xargs -0 -J % mv % . 

Mas isso é útil apenas com nomes de arquivos exclusivos. Por exemplo, dada a seguinte árvore:

.
├── bar
│   ├── test1.jpg
│   ├── test2.jpg
│   └── test3.jpg
├── foo
│   ├── test1.jpg
│   ├── test2.jpg
│   └── test3.jpg
├── qux
│   └── test3.jpg
└── corge
    └── test3.jpg

Eu gostaria de ver um resultado semelhante a:

.
├── bar
├── foo
├── qux
├── corge
├── test1.jpg
├── test1a.jpg
├── test2.jpg
├── test2a.jpg
├── test3.jpg
├── test3a.jpg
├── test3b.jpg
└── test3c.jpg

Alguém pode ajudar?

    
por rvg 25.10.2013 / 20:28

2 respostas

0

A menos que a estrita nomenclatura sequencial em seu exemplo seja super importante para você, eu proporia a seguinte solução "keep it simple" / "quick & dirty":

find . -type f |
while read filename; do
    basename=$(basename "$filename");
    newname=$(echo "$basename" | sed "s/^\(.*\)\(\.[^\.]\+\)$/(XXXX)/");
    printf "mv \"%s\" \"%s\";\n" "$filename" "$(mktemp -u "$newname")";
done

Isso só imprime os comandos que seriam executados, portanto, verifique se há sanidade revendo a saída, em seguida, copiar & cole na linha de comando, se tudo estiver de acordo com a sua satisfação.

Em inglês: encontre-me todos os arquivos regulares, transforme-me seus nomes de arquivo de "test1.jpg" no formulário "test1 (XXXX) .jpg", onde "XXXX" será selecionado e substituído por mktemp com caracteres aleatórios. crie a linha de comando "mv" para esta ação.

Para diminuir ainda mais o risco de colisão de nome de arquivo, basta adicionar mais "X" a ele.

Divirta-se.

    
por 02.04.2014 / 20:40
0

Obtenha uma lista recursiva de todos os arquivos regulares no diretório atual para cada arquivo, corte o "." principal e barra para concatenar o diretório e os nomes de arquivos em uma única string, então mova-o para o diretório atual

list=$(find . -type f)
for file in $list; do
   echo -n "$file to "
   echo $file|cut -d '.' -f2-99| tr -d '/'
   mv "$file" ./"$(echo $file|cut -d '.' -f2| tr -d '/')"
done
    
por 07.04.2018 / 02:30