Имеет ли значение для oc fedora регистр имен файлов и каталогов

Обновлено: 06.07.2024

В Linux вы можете иметь файлы example.JPG и example.jpg в том же каталоге.

В Windows у вас есть расширения с учетом регистра, но вы не можете поместить эти два файла в один каталог. Почему бы нет?

FAT держал расширение отдельно от базового имени, а ОС добавляла . для целей ввода и отображения. (Я полагаю, можно с уверенностью сказать, что практически никто не использует FAT для чего-либо, кроме функциональной совместимости в наши дни.) Я не знаю точно, как NTFS делает это, но я полагаю, что это похоже на любую основную файловую систему Linux, которая просто обрабатывает имя файла как строка символов. Здесь нет ничего особенного в расширении файла: оно просто по соглашению и рассматривается файловой системой как часть имени файла.

В Windows у вас есть расширения с учетом регистра, но вы не можете поместить эти два файла в один каталог. Почему бы нет?

Если диск отформатирован как NTFS, вы можете использовать как example.JPG и example.jpg .

Тем не менее, если вы попытаетесь открыть один из этих файлов в приложении Win32 , например в «Блокноте», у вас будет доступ только к одному из файлов , независимо от того, какое имя файла вы вводите в диалоговом окне «Открыть файл».

Имена файлов чувствительны к регистру на томах NTFS

Как часть требований к соответствию POSIX, файловая система Windows NT (NTFS) предоставляет соглашение о присвоении имен файлов и каталогов с учетом регистра. Хотя NTFS и подсистема POSIX хорошо справляются с чувствительностью к регистру, 16-разрядные приложения на базе Windows, MS-DOS, OS / 2 и Win32 этого не делают .

В NTFS вы можете создавать уникальные имена файлов, хранящиеся в одном и том же каталоге, которые отличаются только регистром. Например, следующие имена файлов могут сосуществовать в одном каталоге на томе NTFS:

Тем не менее, если вы попытаетесь открыть один из этих файлов в приложении Win32 , например в «Блокноте», у вас будет доступ только к одному из файлов , независимо от того, какое имя файла вы вводите в диалоговом окне «Открыть файл».

NTFS поддерживает два слегка отличающихся режима работы, которые могут быть выбраны подсистемой приложения, взаимодействующей с NTFS. Первый полностью учитывает регистр и требует, чтобы имена файлов, предоставляемые приложением, совпадали с именами, хранящимися на диске, включая случай, если файл на диске должен быть выбран. Второй режим работы - это сохранение регистра, но без учета регистра. Это означает, что приложения могут выбирать файлы на диске, даже если указанное имя отличается в случае от имени, сохраненного на диске. Обратите внимание, что оба режима сохраняют регистр, использованный для создания файлов. Отмеченное здесь различие в поведении применяется только тогда, когда приложению необходимо найти существующий файл. POSIX использует преимущества режима полного регистра, в то время как MS-DOS, WOW иПодсистемы Win32 используют режим без учета регистра .

На практике я не смог этого добиться

Чтобы получить два файла в одном каталоге, отличающихся только регистром, вам необходимо включить подсистему Posix .

В POSIX используется полный режим с учетом регистра, в то время как подсистемы MS-DOS, WOW и Win32 используют режим без учета регистра.

Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не появлялась заглавная буква (это исходный код C++, но это не должно иметь значения).

Бонусные баллы за игнорирование CVS и Subversion version control files/folders. предпочтительным способом будет сценарий shell, поскольку shell должен быть доступен в любом поле Linux.

Были некоторые веские аргументы по поводу деталей переименования файла.

Я думаю, что файлы с одинаковыми строчными именами должны быть перезаписаны; это проблема пользователя. При проверке на случай игнорирования файловой системы, он будет перезаписывать первый с последним тоже.

Я бы рассмотрел A-Z символа и преобразовал их в a-z, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).

Сценарий был бы необходим для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления версиями CVS или Subversion должны быть опущены. В конце концов, это всего лишь царапина на кассе. Может быть, "export" более подходит.

У меня, например, TREE.wav, ONE.WAV. Я хочу переименовать его в tree.wav, one.wav. Как переименовать все файлы в нижний регистр?

Мне нужно изменить все имена всех файлов в определенном каталоге на строчные буквы, используя скрипт bash. Более того, я не хочу менять имена подкаталогов, как это было предложено в разделе Как переименовать все папки и файлы в нижний регистр на Linux?

Еще меньше мне очень нравится:

В нечувствительных к регистру файловых системах, таких как OS X HFS+ , вы захотите добавить флаг -f :

Краткая версия с использованием команды "rename" :

Это позволяет избежать проблем с переименованием каталогов перед файлами и попыткой переместить файлы в несуществующие каталоги (например, "A/A" в "a/a" ).

Или более подробная версия без использования "rename" .

Последнее позволяет более гибко использовать команду перемещения (например, "svn mv" ).

Для моего собственного здравомыслия при попытке переместить мои файлы на машину Unix мне нужно автоматически переименовать каждый выходной файл в нижний регистр. В настоящее время я просто переименовываю каждый из них вручную, и нечувствительность к регистру совместимости Windows сделает эту.

Есть ли способ переименовать все файлы в определенной папке в верхний регистр с batch file? Я нашел этот код. Но он переименовывает файлы в нижний регистр. Как изменить его, чтобы переименовать в верхний регистр? for /f Tokens=* %f in ('dir /l/b/a-d') do (rename %f %f)

Просто попробуйте следующее, Если вам не нужно заботиться об эффективности.

Блин, вы, ребята/девчонки, любите все усложнять. Воспользуйся:

Это работает, если у вас уже есть или настроена команда переименования (например, через brew install in Mac):

Вот скрипт, который изменяет только файлы, а не имена каталогов, чтобы не путать find :

Я протестировал его, и он работает с именами файлов, содержащими пробелы, всевозможные кавычки и т. д. Это важно, потому что если вы запускаете от имени root один из этих других сценариев в дереве, которое включает файл, созданный

Это работает на CentOS / Red Hat Linux или других дистрибутивах без скрипта rename Perl:

(В некоторых дистрибутивах команда rename по умолчанию исходит из util-linux, и это другой, несовместимый инструмент.)

--принудительное переименование, даже если файл с именем назначения уже существует.

--преобразование имен файлов в нижний регистр во все строчные буквы.

--nows заменяет все последовательности whitespace в имени файла одиночными символами подчеркивания.

Вот мое неоптимальное решение, использующее сценарий Bash shell:

Все папки переименованы правильно, и mv не задает вопросов, когда разрешения не совпадают, а CVS папки не переименованы (к сожалению, управляющие файлы CVS внутри этой папки все еще переименованы).

Поскольку "find -depth" и "find | sort -r" оба возвращают список папок в удобном порядке для переименования, я предпочел использовать "-глубину" для поиска папок.

Использование фиксатора файлов Ларри Уолла:

Это так же просто, как

(где fix -это, конечно, сценарий выше)

Первоначальный вопрос был задан для игнорирования каталогов SVN и CVS, что можно сделать, добавив-prune в команду find. E.g игнорировать CVS:

[edit] я попробовал это сделать, и встраивание строчного перевода в Находку не сработало по причинам, которые я на самом деле не понимаю. Итак, исправьте это следующим образом::

Это небольшой скрипт shell, который делает то, что вы просили:

Обратите внимание на действие-глубина в первой находке.

Не портативный, только Zsh, но довольно лаконичный.

Во-первых, убедитесь, что zmv загружен.

Кроме того, убедитесь, что extendedglob включен:

Для рекурсивно строчных файлов и каталогов, где имя не CVS .

find -depth печатает каждый файл и каталог, причем содержимое каталога печатается перед самим каталогом. $ строчные буквы имени файла.

На Windows эмуляции, такие как Git Bash , могут потерпеть неудачу, потому что Windows не чувствителен к регистру под капотом. Для этого добавьте шаг, который mv 's файл сначала к другому имени, например "$old.tmp", а затем к $new .

Установите пакет rename ,

Эта команда находит все файлы с расширением *.py и преобразует имена файлов в нижний регистр.

Мне нужно было сделать это на установке Cygwin на Windows 7 и я обнаружил, что получил синтаксические ошибки с предложениями сверху, которые я пробовал (хотя, возможно, я пропустил рабочий вариант). Однако это решение прямо из Ubuntu форумов сработало из банки :-)

(NB: ранее Я заменил whitespace подчеркиванием, используя:

В OS X mv -f показывает ошибку "same file", поэтому я переименовываю дважды:

В этой ситуации я бы потянулся к Python, чтобы не оптимистично предполагать пути без пробелов или косых черт. Я также обнаружил, что python2 имеет тенденцию устанавливаться в большем количестве мест, чем rename .

Если вы используете Arch Linux , вы можете установить пакет rename ) из AUR , который предоставляет команду renamexm в виде исполняемого файла /usr/bin/renamexm и страницу руководства вместе с ней.

Это действительно мощный инструмент для быстрого переименования файлов и каталогов.

Преобразование в нижний регистр

Преобразовать в регистр UPPER

Иной выбор

При необходимости вы можете получить образец файла Developers.mp3 отсюда ;)

Это прекрасно работает и на macOS:

Длинное, Но "Работает Без Сюрпризов & Без Установок "

Этот скрипт обрабатывает имена файлов с пробелами, кавычками, другими необычными символами и Юникодом, работает с нечувствительными к регистру файловыми системами и большинством сред Unix-y , в которых установлены bash и awk (т. е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре), и, конечно же, переименовывает оба файла в каталоги & и работает рекурсивно. Наконец, он очень легко адаптируется: вы можете настроить команду find для таргетинга на файлы/dirs, которые вы хотите, и вы можете настроить awk для выполнения других манипуляций с именами. Обратите внимание, что под "handles Unicode" я подразумеваю, что он действительно преобразует их случай (а не игнорирует их, как ответы, которые используют tr ).

Рекомендации

Мой сценарий основан на этих превосходных ответах:

Сначала переименуйте каталоги снизу вверх сортировкой -r (где-глубина недоступна), затем файлы. Тогда grep -v /CVS вместо find . -prune , потому что это проще. Для больших каталогов, например f в . может переполнить некоторые буферы shell. Используйте find . | while read , чтобы избежать этого.

И да, это будет сбивать файлы, которые отличаются только в случае.

Почистить Переименовать (regex)

Это не совсем то, что просил OP, но то, что я надеялся найти на этой странице:

Версия "slugify" для переименования файлов, чтобы они были похожи на URLs (т. е. включали только буквенно-цифровые символы, точки и тире):

Похожие вопросы:

Недавно я перенес базу данных из коробки windows в коробку linux. Таблицы смешаны между именами в нижнем и верхнем регистре. Мне нужен способ переименовать все таблицы и столбцы в нижний регистр.

В командной строке Windows как я могу переименовать все файлы в нижний регистр и удалить все пробелы?

У меня есть папка (скажем, ее имя ../TEMPO ) со многими папками внутри [A,B,C..Z] на машине linux. Каждая папка имеет еще 3 уровня папок. Некоторые из более глубоких папок имеют строчные имена.

У меня, например, TREE.wav, ONE.WAV. Я хочу переименовать его в tree.wav, one.wav. Как переименовать все файлы в нижний регистр?

Мне нужно изменить все имена всех файлов в определенном каталоге на строчные буквы, используя скрипт bash. Более того, я не хочу менять имена подкаталогов, как это было предложено в разделе Как.

Для моего собственного здравомыслия при попытке переместить мои файлы на машину Unix мне нужно автоматически переименовать каждый выходной файл в нижний регистр. В настоящее время я просто.

Есть ли способ переименовать все файлы в определенной папке в верхний регистр с batch file? Я нашел этот код. Но он переименовывает файлы в нижний регистр. Как изменить его, чтобы переименовать в.

Мне нужна помощь. Я хочу рекурсивно переименовать все файлы в нижний регистр внутри каталога. У меня есть код для тестирования, но он переименовывается только в этой папке, а не рекурсивно. Как я.

У меня есть большой проект со многими пакетами, которые являются CamelCase. Я хочу переименовать их все в нижний регистр, например: От main.MyPackages.Utils до main.mypackages.utils Каков самый.

У меня есть несколько файлов кода HTML, которые содержат значения атрибутов SRC , подобные этому: Значение 1 <IMG SRC=Trig_IMG/102.jpg WIDTH=309 HEIGHT=106> Стоимость 2 <IMG.

Я должен рекурсивно переименовать полное дерево папок, чтобы нигде не было заглавных букв (это исходный код C++, но это не должно иметь значения). Бонусные баллы за игнорирование CVS и SVN контрольных файлов/папок. Предпочтительным способом будет сценарий оболочки, поскольку оболочка должна быть доступна на любом компьютере с Linux.

Были некоторые веские аргументы о деталях переименования файла.

Я думаю, что файлы с одинаковыми строчными именами должны быть перезаписаны, это проблема пользователя. При проверке в файловой системе, в которой не учитывается регистр, первая также будет перезаписана первой.

Я хотел бы рассмотреть символы A-Z и преобразовать их в a-z, все остальное просто вызывает проблемы (по крайней мере, с исходным кодом).

Сценарий необходим для запуска сборки в системе Linux, поэтому я думаю, что изменения в файлах управления CVS или SVN должны быть опущены. В конце концов, это просто проверка заказа. Может быть, «экспорт» более уместен.

Краткая версия с использованием команды "rename" .

Это позволяет избежать проблем с переименованием каталогов перед файлами и попыткой перемещения файлов в несуществующие каталоги (например, "A/A" в "a/a" ).

Или более подробная версия без использования "rename" .

Последнее обеспечивает большую гибкость с помощью команды перемещения (например, "svn mv" ).

меньше все еще мне очень нравится

В нечувствительных к регистру файловых системах, таких как HFS + в OS X, вы захотите добавить флаг -f

Просто попробуйте следовать, если вам не нужно заботиться об эффективности.

Я протестировал его, и он работает с именами файлов, содержащими пробелы, всевозможные кавычки и т.д. Это важно, потому что, если вы запускаете от имени root один из тех других сценариев в дереве, который включает файл, созданный с помощью:

Это работает, если у вас уже есть или настроена команда переименовать (например, через brew install в Mac):

Человек, которого вы, ребята, любите усложнять вещи ..

Это работает в CentOS/Redhat или других дистрибутивах без Perl-скрипта rename :

(в некоторых дистрибутивах команда rename по умолчанию взята из util-linux, и это другой несовместимый инструмент)

Первоначальный вопрос касался игнорирования каталогов SVN и CVS, что можно сделать, добавив -Prune к команде find. Например, игнорировать CVS:

Вот мое неоптимальное решение с использованием сценария bash Shell:

Правка: я сделал некоторые изменения на основе предложений до сих пор. Теперь все папки переименованы правильно, mv не задает вопросов, когда разрешения не совпадают, а папки CVS не переименовываются (к сожалению, контрольные файлы CVS внутри этой папки все еще переименовываются).

Правка: Поскольку «find -depth» и «find | sort -r» оба возвращают список папок в порядке, пригодном для переименования, я предпочел использовать «-depth» для поиска папок.

Использование исправления имени Ларри Уолла

это так же просто, как

Это небольшой скрипт Shell, который делает то, что вы просили:

Обратите внимание на действие -depth в первой находке.

Ранее опубликованное будет отлично работать из коробки или с некоторыми изменениями для простых случаев, но есть некоторые ситуации, которые вы можете принять во внимание перед запуском пакетного переименования:

Что должно произойти, если у вас есть два или более имен на одном уровне в иерархии путей, которые отличаются только регистром, например, ABCdef , abcDEF и aBcDeF ? Должен ли сценарий переименования прерваться или просто предупредить и продолжить?

Как вы определяете нижний регистр для не-US-ASCII имен? Если такие имена могут присутствовать, следует ли сначала выполнить проверку и исключить проход?

Если вы выполняете операцию переименования на рабочих копиях CVS или SVN, вы можете повредить рабочую копию, если измените регистр имен файлов или каталогов. Должен ли скрипт также находить и корректировать внутренние административные файлы, такие как .svn/records или CVS/Entries?

Установите пакет rename ,

Эта команда находит все файлы с расширением *.py и преобразует имена файлов в нижний регистр.

В этой ситуации я хотел бы использовать python, чтобы избежать оптимистичного предположения путей без пробелов и косых черт. Я также обнаружил, что python2 , как правило, устанавливается в большем количестве мест, чем rename .

В OSX mv -f показывает ошибку «тот же файл», поэтому я переименовываю дважды.

find -depth печатает каждый файл и каталог с содержимым каталога, напечатанным перед самим каталогом. $ строчные буквы имени файла.

Не портативный, только Zsh, но довольно лаконичный.

Сначала убедитесь, что zmv загружен.

Также убедитесь, что extendedglob включен:

Для рекурсивных строчных файлов и каталогов, где имя не являетсяCVS.

Я не пробовал более сложные сценарии, упомянутые здесь, но ни одна из версий для командной строки не работала для меня на моем Synology NAS. rename недоступен, и многие из вариантов find терпят неудачу, потому что кажется, что он придерживается более старого имени уже переименованного пути (например, если он находит ./FOO , за которым следует ./FOO/BAR , переименование ./FOO в ./foo все равно продолжит перечислять ./FOO/BAR , хотя этот путь больше не действителен). Выше команда работала у меня без проблем.

Далее следует объяснение каждой части команды:

Он найдет любой файл из текущего каталога (замените . на любой каталог, который вы хотите обработать), используя поиск в глубину (например, он будет перечислять ./foo/bar перед ./foo ), но только для файлов, которые содержат заглавные буквы. Фильтр -name применяется только к базовому имени файла, а не к полному пути. Так что это будет список ./FOO/BAR , но не ./FOO/bar . Это нормально, так как мы не хотим переименовывать ./FOO/bar . Мы хотим переименовать ./FOO , но это будет упомянуто позже (вот почему -depth важен).

Сама по себе эта команда особенно полезна для поиска файлов, которые вы хотите переименовать. Используйте это после полной команды переименования, чтобы искать файлы, которые все еще не были заменены из-за конфликтов имен файлов или ошибок.

Эта часть читает файлы, выводимые 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 для генерации списка команд, которые будут выполняться (удобно, чтобы проверить, что будет сделано, фактически не делая этого)

Это довольно очевидно. Он направляет все сгенерированные команды mv в интерпретатор Shell. Вы можете заменить его на bash или любую оболочку по своему вкусу.

Сначала переименуйте каталоги снизу вверх sort -r (где -depth недоступен), затем файлы . Затем grep -v/CVS вместо find . - Prune потому что это проще . Для больших каталогов, для f в . может переполнить некоторые буферы оболочки . Использовать find . | пока читаешь чтобы избежать этого.

И да, это будет забивать файлы, которые отличаются только в случае .

Если вы используете Arch Linux , вы можете установить rename package из AUR , который предоставляет команду renamexm как исполняемый файл /usr/bin/renamexm и страницу manual вместе с ней.

Это действительно мощный инструмент для быстрого переименования файлов и каталогов.

Преобразовать в нижний регистр

Преобразовать в верхний регистр

Другие опции

Вы можете получить образец файла Developers.mp3 из здесь , если это необходимо;)

Мне нужно было сделать это на установке Cygwin в Windows 7 и обнаружил, что я получил синтаксические ошибки с предложениями из вышеупомянутого, которые я попробовал (хотя я, возможно, пропустил рабочий вариант), однако это решение прямо из форумов ubutu работал из банки :-)

(NB Я ранее заменил пробел с подчеркиванием, используя

--force Rename, даже если файл с именем назначения уже существует.

--lower-case Конвертировать имена файлов в нижний регистр.

--nows Заменить все последовательности пробелов в имени файла символами подчеркивания.

Длительный, но «Работает без сюрпризов и без установок»

Этот скрипт обрабатывает имена файлов с пробелами, кавычками, другими символами необычно и Unicode, работает с нечувствительными к регистру файловыми системами и большинством сред Unix-y, в которых установлены bash и awk (т.е. почти все). Он также сообщает о коллизиях, если таковые имеются (оставляя имя файла в верхнем регистре) и, конечно, переименовывает как файлы и каталоги, так и работает рекурсивно. Наконец, он легко адаптируется: вы можете настроить команду find для выбора нужных вам файлов/каталогов и настроить awk для выполнения других манипуляций с именами. Обратите внимание, что под «дескрипторами Unicode» я подразумеваю, что он действительно преобразует их регистр (не игнорируйте их как ответы, использующие tr ).

В нашей предыдущей статье мы описали, как подсчитать количество файлов и подкаталогов внутри данного каталога. Это руководство покажет вам, как переименовать все имена файлов и каталогов в нижний регистр в Linux.

Есть несколько способов добиться этого, но мы расскажем о двух наиболее эффективных и надежных методах. Для целей этого руководства мы использовали каталог с именем Files , который имеет следующую структуру:


1. Совместное использование команд find, xargs и rename

Утилита find для переименования всех файлов или подкаталогов в конкретном каталоге в нижний регистр следующим образом:

Объяснение опций, используемых в приведенной выше команде.

  • -depth - перечисляет содержимое каждого каталога перед самим каталогом.
  • -n 1 - указывает xargs использовать не более одного аргумента для каждой командной строки из вывода find.

Пример вывода после переименования файлов и подкаталогов в нижний регистр в каталоге Files .


Другой альтернативный способ использования команд mv в сценарии, как описано ниже.

2. Использование команд find и mv в сценарии оболочки

Сначала создайте свой скрипт (вы можете называть его как хотите):

Затем добавьте в него приведенный ниже код.

Сохраните и закройте файл, затем сделайте скрипт исполняемым и запустите его:


Вы также можете прочитать следующие статьи по теме.

  1. Объяснение «Все является файлом» и типов файлов в Linux.
  2. fswatch - отслеживает изменения или модификации файлов и каталогов в Linux.
  3. Fasd - инструмент командной строки, обеспечивающий быстрый доступ к файлам и каталогам
  4. FSlint - Как найти и удалить повторяющиеся файлы в Linux

В этом руководстве мы объяснили вам, как переименовать все файлы и каталоги в нижний регистр в Linux. Если возникнут какие-либо ошибки, напишите нам, заполнив форму обратной связи ниже. Вы также можете предложить нам любые другие способы сделать то же самое.

Читайте также: