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. Якщо ви виконуєте операцію з перейменуванням