Я хотел бы переименовать несколько файлов в одной папке.
Я надеюсь сохранять все исходные имена файлов минус тег в конце.
например, я имею:
FILE1[file].doc
FILE2[file].doc
FILE3[file].doc
и т.д.
Я хочу удалить [file]
из всех файлов в папке рекурсивно, и хотел бы сделать так из командной строки.
Любая справка значительно ценилась бы.
Я предполагаю, что Ваш текущий рабочий каталог является тем, который содержит файлы, как которые Вы хотите переименовать, в этом примере:
$ tree
.
├── FILE1[file].doc
├── FILE2[file].doc
├── FILE3[file].doc
└── subdir
├── FILE1[file].doc
├── FILE2[file].doc
└── FILE3[file].doc
Теперь можно выполнить следующую команду для рекурсивного списка всех файлов в текущем каталоге с расширением .doc
:
$ find . -type f -iname '*.doc'
./subdir/FILE3[file].doc
./subdir/FILE2[file].doc
./subdir/FILE1[file].doc
./FILE3[file].doc
./FILE2[file].doc
./FILE1[file].doc
, Чтобы переименовать все те файлы и удалить [file]
часть прямо перед .doc
расширение (если это присутствует) с каждого имени, выполняет это:
$ find . -type f -iname '*.doc' -exec rename -v 's/\[file\](?=\.doc$)//' {} +
./subdir/FILE3[file].doc renamed as ./subdir/FILE3.doc
./subdir/FILE2[file].doc renamed as ./subdir/FILE2.doc
./subdir/FILE1[file].doc renamed as ./subdir/FILE1.doc
./FILE3[file].doc renamed as ./FILE3.doc
./FILE2[file].doc renamed as ./FILE2.doc
./FILE1[file].doc renamed as ./FILE1.doc
Это выполняет команду rename -v 's/\[file\](?=\.doc$)//' FILES
, где FILES
заменяется списком файлов, возвращенных find
команда, показанная выше.
то, Что эти rename 's/PATTERN/REPLACEMENT/'
делает, должно применяться, образец регулярного выражения \[file\](?=\.doc$)
(соответствует точной строке" [файл]", если сопровождается точной строкой ".doc" в конце строки) к каждым из указанных имен файлов. Если это соответствует, та часть соответствия имени файла заменяется замещающей строкой, которая пуста в нашем случае.
Подход Python, с re.split()
и os.rename()
.
$ ls
FILE1[file].doc FILE2[file].doc FILE3[file].doc
$ python -c "import os,re;[os.rename(f,'.'.join(re.split('\[|\]|\.',f)[::3])) for f in os.listdir('.')]"
$ ls
FILE1.doc FILE2.doc FILE3.doc
, Что происходит, вот то, что мы циклично выполняемся по каждому имени файла в текущем рабочем каталоге в соответствии с os.listdir()
функция, используйте re.split()
, чтобы сломать имя файла в список строк с помощью нескольких разделителей, извлечь первую и последнюю строку и сделать новое имя из тех двух использование '.'.join()
функция. Остальное просто os.rename(old,new)
Примечание, что это - простой подход и не защищает от переименования каталогов или других случайных файлов, которые Вы могли бы иметь в той папке.