Assumindo que seu shell é zsh, coloque autoload -U zmv
no seu ~/.zshrc
e execute
zmv '(*)/*.pdf' '$1/$1.pdf'
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?
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
echo ./1111/1234.pdf | perl -pe '$_.=$_; s/\/(.*?)\/.+\.(.*?)$/\/$1\/$1\.$2/' | xargs -n 2 mv