У меня есть эта файловая структура. Я хотел использовать имя файла образа, добавленное с родительскими именами папок.
Прежде:
├── ak
│ ├── adak
│ │ ├── Hello\ World456
│ │ ├── cup-printing
│ │ │ └── Tshirt-printing.jpg
│ │ ├── hello-\ world789
│ │ ├── hello-world79
│ │ └── tshirt\ printing
│ │ └── Tshirt-printing.jpg
│ ├── akhiok
│ │ ├── Hello\ World456
│ │ ├── cup-printing
│ │ │ └── Tshirt-printing.jpg
│ │ ├── hello-\ world789
│ │ ├── hello-world79
│ │ └── tshirt\ printing
│ │ └── Tshirt-printing.jpg
Здесь родительские имена папок являются ak, Адаком.
Ak = состояние называют Адак = название города.
После того, как это должно быть похожим на это..
После:
├── ak
│ ├── adak
│ │ ├── Hello\ World456
│ │ ├── cup-printing
│ │ │ └── Tshirt-printing-adak-ak.jpg
│ │ ├── hello-\ world789
│ │ ├── hello-world79
│ │ └── tshirt\ printing
│ │ └── Tshirt-printing-adak-ak.jpg
│ ├── akhiok
│ │ ├── Hello\ World456
│ │ ├── cup-printing
│ │ │ └── Tshirt-printing-akhiok-ak.jpg
│ │ ├── hello-\ world789
│ │ ├── hello-world79
│ │ └── tshirt\ printing
│ │ └── Tshirt-printing-akhiok-ak.jpg
Команда Bash может помочь здесь?
Любая справка высоко ценится.
Заранее спасибо. :)
С perl-переименовывают (sudo apt install rename
):
rename -n 's/(.+)\/(.+)\/.+\/[^.]+/[110]amp;-$2-$1/' ak/*/*/*.jpg
Эта команда должна быть запущена в ak
’s родительский каталог. Это s
замены путь вплоть до дополнительной точки с собой сопровождаемый вторым и затем первым именем каталога, каждый разделенный с дефисами. С -n
это просто печатает то, что это хочет сделать, удалите эту опцию выполнить переименование.
s/a/b/
†“замена a
с b
(.+)\/
соответствия по крайней мере один символ, сохраняющий его в группе и наклонной черте /
, которого нужно оставить с обратной косой чертой \
.+\/
то же, не сохраняя его в группе †“мы, don’t нужен третий каталог снова [^.]+
соответствия по крайней мере один символ, который не является точкой †“, это соответствует любому имени файла до первой точки (обратите внимание, что это означает Вас, can’t имеют любые другие точки в Вашем имени файла, чем просто дополнительная точка!) [1114]amp;-$2-$1
= целая совпавшая строка -
вторая группа -
первый Пример группы $ tree ak
ak
├── adak
│ ├── cup-printing
│ │ └── Tshirt-printing.jpg
│ └── tshirt printing
│ └── Tshirt-printing.jpg
└── akhiok
├── cup-printing
│ └── Tshirt-printing.jpg
└── tshirt printing
└── Tshirt-printing.jpg
6 directories, 4 files
$ rename -n 's/(.+)\/(.+)\/.+\/[^.]+/[111]amp;-$2-$1/' ak/*/*/*.jpg
rename(ak/adak/cup-printing/Tshirt-printing.jpg, ak/adak/cup-printing/Tshirt-printing-adak-ak.jpg)
rename(ak/adak/tshirt printing/Tshirt-printing.jpg, ak/adak/tshirt printing/Tshirt-printing-adak-ak.jpg)
rename(ak/akhiok/cup-printing/Tshirt-printing.jpg, ak/akhiok/cup-printing/Tshirt-printing-akhiok-ak.jpg)
rename(ak/akhiok/tshirt printing/Tshirt-printing.jpg, ak/akhiok/tshirt printing/Tshirt-printing-akhiok-ak.jpg)
$ ^-n^^ # ← this prints and runs the former command line without “-n”
rename 's/(.+)\/(.+)\/.+\/[^.]+/[111]amp;-$2-$1/' ak/*/*/*.jpg
$ tree ak
ak
├── adak
│ ├── cup-printing
│ │ └── Tshirt-printing-adak-ak.jpg
│ └── tshirt printing
│ └── Tshirt-printing-adak-ak.jpg
└── akhiok
├── cup-printing
│ └── Tshirt-printing-akhiok-ak.jpg
└── tshirt printing
└── Tshirt-printing-akhiok-ak.jpg
6 directories, 4 files
Попробуйте это,
find . -name "*.jpg" -exec sh -c '
suffix=$(printf "%s" "$1" | awk -F"/" "{for(i=NF-2;i>1;i--)printf \"-\"\$i;}");
echo mv "$1" "${1%.*}${suffix}.${1##*.}";
' find-sh {} \;
awk
, команда перестанет работать. echo
для выполнения эти mv
команда, если Вы довольны выводом.