Я хочу переименовать каждую папку с именем одного файла внутри. Пример:
Folder1/AAA.jpg
Folder2/BBB.jpg
FOlder3/CCC.jpg
Folder4/05.02.2019.jpg
to
AAA/AAA.jpg
BBB/BBB.jpg
CCC/CCC.jpg
05.02.2019/05.02.2019.jpg
В Windows I могу сделать это с помощью этого сценария в простом пакете файлов:
for /d %%a in (*) do (
for %%b in ("%%a\*.jpg","%%a\*.png") do (
ren "%%a" "%%~nb"
)
)
В Ubuntu я пробовал, но, возможно, я пишу неправильный синтаксис. Вы можете мне помочь?
Вот почти аналогичный сценарий удара:
#!/bin/bash
for i in Folder*/*
do
FILE="$(basename "$i")"
mv "$(dirname "$i")" "${FILE%.*}"
done
Пример использования:
$ tree
.
├── Folder1
│ └── some name.png
└── Folder2
└── 03.02.2019.jpg
2 directories, 2 files
$ for i in Folder*/*; do FILE="$(basename "$i")"; mv "$(dirname "$i")" "${FILE%.*}"; done
$ tree
.
├── 03.02.2019
│ └── 03.02.2019.jpg
└── some name
└── some name.png
2 directories, 2 files
Если необходимо проверить, является ли расширение jpg или png:
#!/bin/bash
for i in Folder*/*
do
if [[ $i =~ (jpg|png)$ ]]
then
FILE="$(basename "$i")"
mv "$(dirname "$i")" "${FILE%.*}"
fi
done
Можно удалить ограничение имени каталога при помощи */*
вместо Folder*/*
. Также можно изменить соответствующую строку к echo mv "$(dirname "$i")" "${FILE%.*}"
для теста пробного прогона.
Дальнейшее чтение:
Принятие они - все в том же родительском каталоге:
for f in */*.jpg ; do mv "$(dirname "$f")" "$(basename "$f" .jpg)" ; done
В медленном-mo:
*/*.jpg
перечислит Folder1/AAA.jpg
,Folder2/BBB.jpg
,FOlder3/CCC.jpg
$(dirname "$f")
извлечения Folder1
,Folder2
,FOlder3
"$(basename "$f" .jpg)"
извлекает имя файла и отбрасывает расширение: AAA
, BBB
, CCC
...mv Folder1 AAA
, mv Folder2 BBB
...Этот сценарий удара изменяет имена папок.
#!/bin/bash
echo Enter old foldername
read oldfoldername
echo Enter new foldername
read newfoldername
mv $oldfoldername $newfoldername
Usage: bash {filename you copied script into}.sh