Linux-скрипт или программа для сокращения имен файлов

У меня не было большого успеха в поиске Linux-версии namemangler , которую мне нужно переименовать 1000 файлов, чтобы они были доступны для чтения в Windows.

Кто-нибудь знает о программе Linux, которая может это сделать?

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

  • Создание предложений для ошибок из словаря поиска
  • Проблема автоматического расширения с элементами массива, содержащими «*» (звездочку)
  • Почему `` `встроенная оболочка и` [[`ключевое слово оболочки?
  • Какие символы нужно избегать в файлах без кавычек?
  • Bash перезаписывает первую строку при использовании пользовательской подсказки PS1
  • Ошибка синтаксиса рядом с неожиданным токеном `done '
  • Как реализовать механизм повтора при выполнении URL-адреса сервера в сценарии оболочки?
  • Выполнить скрипт оболочки из php, как пользователь root?
  • 7 Solutions collect form web for “Linux-скрипт или программа для сокращения имен файлов”

    В Debian, Ubuntu и производных, если вы введете man rename в командной строке, вы получите страницу руководства для утилиты переименования, которая позволяет использовать в переименовании любые Perl-подобные команды регулярных выражений.

    Например, это сократит (путем усечения) все файлы в текущем каталоге до пяти:

     rename 's/^(.{5}).*/$1/' * 

    Он работает, захватывая первые пять символов, затем используя это в замещении, удаляя остальные.

    Другим примером является сокращение имен файлов (без расширения) до пяти символов, сохраняющих расширение:

     rename 's/^(.{5}).*(\..*)$/$1$2/' * 

    Он захватывает две группы, первый из которых является первым пятью символами, второй – расширением. Это превратит myCarefullyCraftedDocument.pdf в myCar.pdf .

    Предупреждение. Используйте это внимательно, желательно на копии своего каталога или сначала сделав резервные копии. Вы были предупреждены!! На минимальном минимуме сначала используйте rename -n , который покажет вам, что было бы сделано без его фактического выполнения.

    Вы можете перемещать конфликтующие файлы в другой каталог:

     for i in * do j=${i:0:16} if [ -e "$j" ] then mv "$i" /path/to/rename/later else mv "$i" "$j" fi done 

    Вы можете написать сценарий, чтобы сократить имена файлов и удалить символы, которые Windows не нравится в нескольких строках bash. Предупреждение, непроверенный код, введенный непосредственно в мой браузер.

     shopt -s dotglob extglob for x in *; do y=${x//+([!-!#$%&'().0-9@AZ^_`az{}~])/_} # change all problematic characters to _ if [[ $y = .* ]]; then y=_${y#.}; fi # change dot files to begin with _ y=${y:0:16} # truncate names y=${y,,} # convert to lowercase if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then # The file exists or is a DOS/Windows reserved name. # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here) i=1 if [[ $y =~ \. ]]; then prefix=${y%%.*}; suffix=.${y#*.} else prefix=$y; suffix= fi y=${prefix}~$i$suffix while [[ -e $y ]]; do ((++i)) y=${prefix}~$i$suffix done fi mv -- "$x" "$y" done 

    Если вам нужно переписать в подкаталоги, вызовите сценарий оболочки из find -depth -exec … Или используйте zsh вместо bash; в zsh, **/*(od) сначала распространяется на все файлы в текущем каталоге, рекурсивно, с более глубоко вложенными файлами.

    Shell / python / perl-скрипты для такого рода вещей просто прекрасны, но похоже, что приложение gui было бы лучше для вас, поэтому я бы рекомендовал pyRenamer , который может делать именно то, что вы хотите, среди многих других вещей (простые общие операции через пресеты [избавление от пробелов, усечение имени файла из одной точки в другую], простой поиск / замена, сложное регулярное выражение, предварительный просмотр и т. д.).

    Ваш дистрибутив может даже иметь его в своем репозитории программ (Fedora делает).

    В некоторых системах нет команды rename , поэтому, как альтернатива ответа paxdiablo, вот как сделать то же самое с mv .

     for f in *.pdf; do tmp=`echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/'` mv -b ./"$f" ./"$tmp" done 

    Флаг -b при перемещении создает резервную копию файлов, которые будут удалены или перезаписаны. Изменяя шаблон glob в цикле for, вы можете настроить, какие файлы он запускает, используя * самостоятельно для запуска во всех файлах.

    Если вам нужно поэкспериментировать с переименованием файлов и, если у вас есть библиотеки KDE, установленные в вашей системе (или не против их добавления), проверьте krename.

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

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

     for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g') done & 
    Linux и Unix - лучшая ОС в мире.