LINUX.ORG.RU

файловые менеджеры и недопустимые символы.

 ,


0

1

Есть ли файловый менеджер, способный автоматически копировать/перемещать с переименованием такие файлы ? Есть флешки и dvd, где очень много файлов с символами «:», и.т.д, неподходящими для exfat.

Нашёл для «очистки» имён программку detox, но это не файловый менеджер, это просто утилита, надо писать скрипт: неудобно… Ну на скорую руку сочинил:

$ IFS=$'\n' ; for i in $( find /media/mylogin -name "*:*" ) ; do destfolder=~/renamefiles ; namefolder=$( dirname $i ) ; if [[ ! -d $destfolder/$namefolder ]] ; then mkdir -p $destfolder/$namefolder ; fi ; detox $i $destfolder ; done

Но это не то: detox только переименовывает, а нужно копировать с read-only системы…

Смонтируй посредством unionfs / aufs в новую точку каскадную ФС, где read only слой - CD / DVD / прочее и в точке монтирования переименовывай как тебе нравится, а оттуда уже копируй.

Альтернативный вариант - создай символьные ссылки с нужными именами на файлы / директории на RO файловую систему, а далее rsync делай копирование символьных ссылок с параметром, чтобы копировались данные вместо ссылки.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

надо писать скрипт: неудобно…

Ты уже написал, сохрани в файл, будет скрипт. В любом файлменеджере можно запускать скрипт. Удобней Midnight commander, код можно поместить в его файл mc.menu, в «user menu»(F2) появится пункт запуска этого кода.

По коду. destfolder - само название говорит, что сюда сохраняется результат, задай ему правильное значение. Ты проверяешь, создаешь $destfolder/$namefolder, но не используешь его.

andytux ★★★★★
()
Ответ на: комментарий от andytux

создаешь $destfolder/$namefolder, но не используешь его

Эта переменные (c mkdir) воспроизводят структуру источника на новом месте. А, так, соглашусь: это мне не нравится, правда, не пойму чем :(

moskvich
() автор топика
Ответ на: комментарий от kostik87

В Thunar (кажется QT) совершенно точно - нет, он пишет, что-то вроде «Операция невозможна», и всё… Nautilus не пробовал - он тянет за собой весь гном, по той же причине не пользуюсь kde -тяжело слишком

Вообще-то под «файловыми менеджерами», я имел ввиду, прежде всего, менеджеры вроде doublecmd, midnightcmd или krusader :)

moskvich
() автор топика
Ответ на: комментарий от moskvich

Вот и первое неудобство. Ты хотя-бы систему и DE назвал, можно было-бы определённее говорить, работает или нет. MC заработает везде и не потянет ничего.

andytux ★★★★★
()
Ответ на: комментарий от moskvich

В Thunar (кажется QT) совершенно точно - нет, он пишет, что-то вроде «Операция невозможна»

4.2

Либо ты просто не шаришь, вызов кастомных команд и скриптов в Thunar реализован и работает.

anonymous
()
Ответ на: комментарий от kostik87

Ему не дроч с ручным запуском скриптов нужен (пусть и из гуи) а чтобы операция выглядела как копирование, запускалась настолько же легко, но на лету переименовывала.

firkax ★★★★★
()

тебе детоксы и не нужны. просто через find ищешь все файлы в опр каталоге, а потом циклом по ним из $srcname удаляешь плохие символы и воссоздаешь файловую структуру mkdir -p ${dst}${чистое_имя_без_последнего_сегмента} и затем cp $srcname $чистое_имя. скорми нейронке мое сообщение. она тебе скрипт родит

rtxtxtrx ★★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от firkax

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

Если можешь предложить готовый вариант - предлагай.

kostik87 ★★★★★
()

Переделал. Но я бы не назвал это скриптом, но пусть будет здесь:

IFS=$'\n' ; destination=../renamefiles ; for i in $( find . -iname "*[\\><|?*/:]*" ) ; do newpath=$( dirname $i ) ; newname=$( basename $( echo "$i" | tr '\><|?*:"' ' ')) ; if  [[ ! -d $destination/$newpath ]] ; then mkdir -p $destination/$newpath/$newname ; fi ; cp $i $destination/$newpath/$newname ; done

Но хотелось бы, чтобы mc научился массово переименовывать…

moskvich
() автор топика
Ответ на: комментарий от moskvich

Это очень узко специфичная нужная только тебе и ещё кому-то, кто додумался использовать в именах файлов спец и служебные символы.

Да, в linux ты можешь создать файл или директорию с символами :\ и рядом других, которые в файловых системах Майкрософт и в принципе в ОС от Майкрософт считаются разделителями пути и разделителями имени диска.

Думаю делать в mc или где-то ещё никто это не будет.

Это называется: «Проблемы негров шерифа не волнуют».

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от moskvich

Свой однострочник сохраняешь в файл massrename. MC, в файл mc.menu добавляешь код:

Mass rename
  if [ -x '/usr/bin/massrename' ]
    then massrename
    else IFS=$'\n'
        destination=../renamefiles ; for i in $( find . -iname "*[\\><|?*/:]*" ) ; do newpath=$( dirname $i ) ; newname=$( basename $( echo "$i" | tr '\><|?*:"' ' ')) ; if  [[ ! -d $destination/$newpath ]] ; then mkdir -p $destination/$newpath/$newname ; fi ; cp $i $destination/$newpath/$newname ; done
  fi

В ветке ‘else’ копия твоего однострочника. В ‘user menu’ появится пункт ‘Mass rename’. Если существует скрипт, то запустит скрипт, в противном случае выполнит ‘копию однострочника’.

Это концепт. Не проверял. Могут быть ошибки. Можно бесконечно дорабатывать, повышая удобство. Самое очевидное, текущая панель - источник, что переименовывать, вторая панель - приемник, куда сохранять переименованное.

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)