find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Я не пробував згаданих тут більш досконалих сценаріїв, але жодна з версій єдиного командного рядка не працювала для мене в моїй Synology NAS. renameнедоступний, і багато варіантів виходу з findладу, тому що, здається, він дотримується старішої назви вже перейменованого шляху (наприклад, якщо він знайде, ./FOOза яким слідує ./FOO/BAR, перейменування ./FOOна ./fooвсе ще продовжить список, ./FOO/BARнавіть якщо цей шлях більше не дійсний) . Вище команда працювала на мене без жодних питань.
Далі йде пояснення кожної частини команди:
find . -depth -name '*[A-Z]*'
Тут ви знайдете будь-який файл із поточного каталогу (змініть .будь-який каталог, який ви хочете обробити), використовуючи поглиблений пошук (наприклад, він буде перерахований ./foo/barраніше ./foo), але лише для файлів, що містять великі символи. -nameФільтр застосовується тільки до базового імені файлу, а не повний шлях. Так це буде перераховано, ./FOO/BARале ні ./FOO/bar. Це нормально, оскільки ми не хочемо перейменовувати ./FOO/bar. Хочемо перейменувати ./FOO, але це перелічено пізніше (саме тому -depthважливо).
Ця команда сама по собі особливо корисна для пошуку файлів, які ви хочете перейменувати в першу чергу. Використовуйте це після повної команди перейменування для пошуку файлів, які все ще не замінені через зіткнення імен файлів або помилок.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Ця частина читає файли, що виводиться, findі форматує їх у mvкоманді, використовуючи регулярний вираз. Цей -nпараметр зупиняється на sedдруку вводу, і pкоманда в пошуковому та замісному регулярному виразі видає замінений текст.
Сам регулярний вираз складається з двох захоплень: частини до останнього / (що є каталогом файлу) та самого імені файлу. Каталог залишається недоторканим, але ім'я файлу перетворюється на малі регістри. Отже, якщо findвиходи ./FOO/BAR, це стане mv -n -v -T ./FOO/BAR ./FOO/bar. -nВаріант mvпереконується існуючі малих файли не будуть перезаписані. -vОпція робить mvвисновок кожну зміну , що він робить (або не робить - якщо ./FOO/barвже існує, то він видає що - щось на зразок ./FOO/BAR -> ./FOO/BAR, зазначивши , що ніяких змін не було зроблено). Тут -Tдуже важливо - він розглядає цільовий файл як каталог. Це дозволить переконатися, що ./FOO/BARвін не переміщується, ./FOO/barякщо цей каталог існує.
Використовуйте це разом із, findщоб створити список команд, які будуть виконуватись (зручно для перевірки того, що буде зроблено, не роблячи насправді)
sh
Це досить зрозуміло. Він спрямовує всі створені mvкоманди до інтерпретатора оболонки. Ви можете замінити його bashабо будь-якою оболонкою на свій смак.
ABCdef,abcDEFтаaBcDeF? Чи повинен сценарій перейменування перервати або просто попередити та продовжити? 2. Як ви визначаєте малі регістри для імен, які не належать США та ASCII? Якщо такі імена можуть бути присутніми, чи слід спочатку виконати одну перевірку та виключити пропуск? 3. Якщо ви виконуєте операцію з перейменуванням