Переименовать файлы в каталоге

10

Как переименовать файлы в каталоге, таком как следующий файл: PMC21375.pdf.txtмне нужно переименовать в 21375.txt. т.е. мне нужно удалить оба PMCи pdfиз каждого имени файла.

kylejudita
источник

Ответы:

9

С «s rename:

rename 's/(PMC|\.pdf)//g' *pdf.txt 

Демо:

$ ls *txt
PMC21375.pdf.txt
$ rename -n 's/(PMC|\.pdf)//g' *txt 
PMC21375.pdf.txt -> 21375.txt

из shellподсказки. Это очень полезно, вы можете поместить некоторый код, как я, в подстановку.

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

предупреждение Существуют другие инструменты с таким же именем, которые могут или не могут сделать это, поэтому будьте осторожны.

Если вы запустите следующую команду ( linux)

$ file $(readlink -f $(type -p rename))

и у вас есть результат, как

.../rename: Perl script, ASCII text executable

тогда это кажется правильным инструментом =)

Если нет, чтобы сделать его по умолчанию (обычно уже так) Debianи производной, как Ubuntu:

$ sudo update-alternatives --set rename /path/to/rename

(заменить /path/to/renameпуть вашей perl's renameкоманды.


Наконец, что не менее важно, этот инструмент был первоначально написан Ларри Уоллом, отцом Perl.

Жиль Квено
источник
Это не удалит .pdfиз имени файла.
Уильям Эверетт
Сообщение отредактировано соответственно.
Жиль Квено
5

Помимо команды переименования вы можете сделать это непосредственно в bash (только один из многих способов):

 for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done

Отредактировано, чтобы показать Пиньяке, как это работает:

hmontoliu@ulises2:/tmp/foo$ touch PCM21375.pdf.txt PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ ls
   PCM21375.pdf.txt  PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
hmontoliu@ulises2:/tmp/foo$ ls
   21375.txt  21376.txt
hmontoliu
источник
Это не удалит .pdfиз имени файла.
Уильям Эверетт
ты пробовал это? потому что для меня это так. Показано в редактировании.
hmontoliu
Виноват. Я думал, что это будет просто конвертировать заглавные буквы. Upvoted.
Уильям Эверетт
4

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

rename PMC '' *txt
rename .pdf '' *txt

Первый параметр - это часть имени файла, которую нужно заменить. Второй параметр - строка замены. Здесь я использую ''для представления пустой строки. Все следующие параметры являются файлами для переименования, здесь я использовал *txtдля ограничения замены текстовые файлы.

renameдолжен уже присутствовать, если вы работаете в Linux. Если вы используете * BSD или OS X, вам, возможно, придется сначала установить его.

wingedsubmariner
источник
Я не думаю, что есть GNU rename. Есть один из util-linuxи один perlс другим синтаксисом. Один вы ссылаетесь на внешний вид , как один из , util-linuxкоторый иногда называют rename.ulтак, чтобы не путать с renameс perl, в то время как на некоторых других системах, renameявляется один из Util-Linux и один из perlназываются prename.
Стефан Шазелас
1
Мой тот из util-linux. Я ошибочно думал, что это было частью GNU coreutils.
wingedsubmariner
Версия переименования Debian по умолчанию будет выглядеть примерно так rename 's/PMC// *.txtиrename s/\.pdf// *.txt
Уильям Эверетт,
1

Сначала сделайте резервную копию ваших файлов! Тогда в основном вы можете использовать однострочник Python в текущем каталоге в общем виде:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

в вашем конкретном случае вы можете использовать это дважды:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

удалить .pdfи снова:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

удалить PMC.

xaratustra
источник
0

Попробуй это:

for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done

В j=${i//\.pdf/}средстве заменить .pdfв $iкорыте. Точно так же со вторым назначением j избавиться от PMC.

Уильям Эверетт
источник
0

Если вы используете zsh, это типичная работа для zmv:

zmv 'PMC(*).pdf.txt' '$1.txt'

( zmvобрабатывает потенциальные конфликты изящно).

Стефан Шазелас
источник