Переименование файла (.filename) в исходные имена

Переименование файла (.filename) в исходные имена

Я пытаюсь отменить изменение, внесенное с помощью rename.

Я переименовывал файлы в подпапке, а затем, не задумываясь, попытался очистить ..имена с помощью:

rename "s/.././" *

Теперь у меня есть папка из 600 файлов, в которой первые 2 буквы имени каждого файла изменены на.zzyGir*

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

Я пробовал разные вещи, но безуспешно, например:

rename "s/./Di/; *

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

решение1

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

Обязательно имейте bashв терминале

bash

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

shopt -s dotglob
rename -n 's/^\./Di/' *

Если все выглядит хорошо

rename 's/^\./Di/' *

Завершить с

shopt -u dotglob

Объяснение

  • rename -n "s/^\./Di/" *

    • -n

      Никаких действий: вывести имена файлов, которые необходимо переименовать, но не переименовывать их.

    • /^\./

      • ^установить позицию в начале строки

      • \.соответствует персонажу .буквально

  • shopt -s dotglob&shopt -u dotglob

    • shopt

      shopt [-pqsu] [-o] [optname …]
      

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

    • -s

      Включить (установить) каждый параметр.

    • -u

      Отключить (сбросить) каждое имя параметра.

    • dotglob

      Если установлено, Bash включает имена файлов, начинающиеся с буквы, .в результаты расширения имен файлов.


Пример

$ ls -oag
total 88
drwxrwxr-x   2  4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r--   1     0 Jul 17 17:16 .foo

$ rename "s/^\./Di/" *

$ ls -oag
total 88
drwxrwxr-x   2  4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r--   1     0 Jul 17 17:16 Difoo

Я не совсем понимаю, что вы имеете в виду.

Есть ли способ изменить «.» обратно на первые буквы каждого имени файла?

Вы имеете в виду что-то подобное?

.zzyGir->zzzzGir

Если да, то используйте эти команды в bash:

shopt -s dotglob
rename -n 's/^\.(..)(.*)/$1$1$2/' *

Проверьте результаты и переименуйте с помощью

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

И наконец еще раз

shopt -s dotglob

решение2

Насколько я понимаю, у вас есть папка с файлами, например, такими как ниже:

ls -la

drwxrwxr-x 2 ron ron 4096 Jul 17 20:50 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 .abc
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 .Gyr
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 .hig123
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 .zyz

и вы хотите удалить .из всех имен файлов, чтобы получилось:

abc
Gyr
hig123
zyz

Для этого вы можете использовать findи rename:

find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;

Приведенная выше команда (т.е. с -n) является пробным запуском:

find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
rename(./.zyz, zyz)
rename(./.abc, abc)
rename(./.Gyr, Gyr)
rename(./.hig123, hig123)

Запустите его, не -nменяя имена файлов:

find . ! -path . -type f -name ".*" -exec rename "s/.\/.//" {} \;
ls -la
total 8   
drwxrwxr-x 2 ron ron 4096 Jul 17 20:59 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 abc
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 Gyr
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 hig123
-rw-rw-r-- 1 ron ron    0 Jul 17 20:47 zyz

Связанный контент