Я пытаюсь отменить изменение, внесенное с помощью 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