Просто выстрел в синем, но делает
shopt -s checkwinsize off
работа?
Принятие Вашей оболочки является zsh, помещенным autoload -U zmv
в Вашем ~/.zshrc
, и выполненный
zmv '(*)/*.pdf' '$1/$1.pdf'
Следующее bash
сценарий делает задание при вызове в родительском каталоге. Это делает так, даже когда файлы все не имеют того же расширения (они делают в Вашем ограниченном примере, но это могло бы быть совпадением):
#!/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 ./????/*
вызов там принимает любой файл в подкаталоге текущего каталога, который имеет имя с четырьмя символами. Можно обмениваться последней строкой с:
dirnametofilename $*
и укажите имена файлов как параметры к сценарию
Следующее создает несколько более глубокую иерархию, и использование находит для определения местоположения файлов. export -f
удостоверьтесь bash
запущенный find
знает о функции:
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