Изменить имена файлов в текущей директорий в нижний регистр. Как?
Как переименовать файлы в нижний регистр ? Используя при этом find и awk
Пример (before):
./AaA
./aAa
./ ...
(after):
./aaa
./aaa
/ ...
Ответы (3 шт):
find . -type f -exec sh -c "mv {} \$(echo {} | awk '{ print tolower(\$0) }')" \;
Втекущей директории можно обойтись без find'а и awk'а, как-то так:
for f in *; { mv "$f" "${f,,}"; }
так как в простой задаче по переименованию могут всплыть много проблем, постараемся заранее очертить их
- Переименовать нужно файлы и только файлы в текущей и вложенных в неё директориях
- Переименовывать нужно также и скрытые(те что начинаются на точку) файлы
- Недопустить потерю файлов при переименовании когда конечное название будет одинаково, например:
FILE.txtиfile.TXTоба станутfile.txtчто приведёт к потере одного из них, в данном случае можно отметить файл с похожим названием дополнительным обозначением.
и так на основе вышесказанного, создадим полигон для тестирования учитывающие вышеупомянутые проблемы
$ rm -rf test;mkdir -p test/DIR; touch test/DIR/File" "1.txt; touch test/.File" "2.txt; touch test/{F,f}ile3.txt; tree -a test
test
├── DIR
│ └── File 1.txt
├── .File 2.txt
├── file3.txt
└── File3.txt
1 directory, 4 files
выполним команду для преобразования
$ find test -type f -execdir sh -c 'f="{}";mv --backup=numbered -v "$f" "${f,,}"' \;
mv: './file3.txt' и './file3.txt' - один и тот же файл
переименован './File3.txt' -> './file3.txt' (резервная копия: './file3.txt.~1~')
переименован './.File 2.txt' -> './.file 2.txt'
переименован './File 1.txt' -> './file 1.txt'
здесь -execdir выполнит команду только после перехода внутрь конечной папки, то есть это позволит нам избежать переименования поддиректорий.
по итогу получим
$ tree -a test
test
├── DIR
│ └── file 1.txt
├── .file 2.txt
├── file3.txt
└── file3.txt.~1~
1 directory, 4 files
здесь окончание *.~1~ указывает на файл с дублирующим именем и он автоматом создаётся утилитой mv с помощью ключа --backup, при желании окончание можно переопределить под свои нужны с помощью ключа --suffix
п.с.
если обязательно для преобразования использовать awk то можно сделать так:
find test -type f -execdir sh -c "mv --backup=numbered -v \"{}\" \"\$(echo {} |awk '{print tolower(\$0)}')\"" \;