Рекурсивный переименовывают для удаления конца нескольких имен файлов в папке

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

Я надеюсь сохранять все исходные имена файлов минус тег в конце.

например, я имею:

FILE1[file].doc

FILE2[file].doc

FILE3[file].doc

и т.д.

Я хочу удалить [file] из всех файлов в папке рекурсивно, и хотел бы сделать так из командной строки.

Любая справка значительно ценилась бы.

1
задан 25 January 2017 в 23:01

2 ответа

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

$ 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" в конце строки) к каждым из указанных имен файлов. Если это соответствует, та часть соответствия имени файла заменяется замещающей строкой, которая пуста в нашем случае.

2
ответ дан 7 December 2019 в 13:37

Подход 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)

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

0
ответ дан 7 December 2019 в 13:37

Другие вопросы по тегам:

Похожие вопросы: