Substituir nome do arquivo pelo nome da pasta pai

2

Eu tenho um monte de arquivos em seu próprio subdiretório. Eu preciso escrever um script para renomear cada arquivo para ter o mesmo nome que o diretório: Por exemplo, dado:

./1111/1234.pdf
./2222/2345.pdf
./1234/3214.pdf

Eu preciso que eles sejam renomeados para:

./1111/1111.pdf
./2222/2222.pdf
./1234/1234.pdf

Como posso fazer isso?

    
por Duy 10.06.2013 / 22:33

3 respostas

4

Assumindo que seu shell é zsh, coloque autoload -U zmv no seu ~/.zshrc e execute

zmv '(*)/*.pdf' '$1/$1.pdf'
    
por 11.06.2013 / 02:12
2

O script bash a seguir faz o trabalho quando chamado no diretório pai. Ele faz isso mesmo quando os arquivos não têm a mesma extensão (eles fazem no seu exemplo limitado, mas isso pode ser uma coincidência):

#!/bin/bash
function dirnametofilename() {
  for f in $*; do
    bn=$(basename "$f")
    ext="${bn##*.}"
    filepath=$(dirname "$f")
    dirname=$(basename "$filepath")
    mv "$f" "$filepath/$dirname.$ext"
  done
}

dirnametofilename ./????/*

a chamada assume qualquer arquivo em um subdiretório do diretório atual que tenha um nome com quatro caracteres. Você pode trocar a última linha com:

dirnametofilename $*

e especifique os nomes dos arquivos como parâmetros para o script

O seguinte cria uma hierarquia um pouco mais profunda e usa a localização para localizar os arquivos. O export -f garante que o bash iniciado por find conheça a função:

mkdir -p x/y/z/1111 x/y/z/2222 x/y/z/1234
touch x/y/z/1111/1234.pdf
touch x/y/z/2222/2345.pdf
touch x/y/z/1234/3214.pdf

function dirnametofilename() {
  for f in $*; do
    bn=$(basename "$f")
    ext="${bn##*.}"
    filepath=$(dirname "$f")
    dirname=$(basename "$filepath")
    mv "$f" "$filepath/$dirname.$ext"
  done
}

export -f dirnametofilename

find . -name "*.pdf" -exec bash -c 'dirnametofilename "{}"'  \;
# and look at the result
find x
    
por 11.06.2013 / 05:24
0
echo ./1111/1234.pdf | perl -pe '$_.=$_; s/\/(.*?)\/.+\.(.*?)$/\/$1\/$1\.$2/' | xargs -n 2 mv
    
por 11.06.2013 / 18:27