Як перейменувати файли в каталозі, такому як наступний файл: PMC21375.pdf.txt
мені потрібно перейменувати 21375.txt
. тобто мені потрібно видалити як PMC
і pdf
з кожного імені файлу.
Як перейменувати файли в каталозі, такому як наступний файл: PMC21375.pdf.txt
мені потрібно перейменувати 21375.txt
. тобто мені потрібно видалити як PMC
і pdf
з кожного імені файлу.
Відповіді:
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
команди.
Не в останню чергу, цей інструмент спочатку написав Ларрі Уолл, тато Перла.
Крім команди перейменування, ви можете виконати її безпосередньо в bash (лише один із способів багатьох):
for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
Відредаговано, щоб показати Pinyaka, як це працює:
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
.pdf
з імені файлу.
Існує кілька утиліт для перейменування файлів, але одна з найпростіших у використанні - це rename
. У вашому випадку ви, ймовірно, можете:
rename PMC '' *txt
rename .pdf '' *txt
Перший параметр - частина назви файла, яку потрібно замінити. Другий параметр - рядок заміни. Тут я використовую ''
для представлення порожнього рядка. Усі наступні параметри - це файли для перейменування, тут я використовував *txt
обмеження заміни на текстові файли.
rename
вже має бути присутнім, якщо ви працюєте з Linux. Якщо ви використовуєте * BSD або OS X, можливо, вам доведеться спочатку встановити його.
rename
. Один з util-linux
, а інший perl
із різним синтаксисом. Один ви посилаєтеся на зовнішній вигляд , як один з , util-linux
який іноді називають rename.ul
так, щоб не плутати з rename
з perl
, в той час як на деяких інших системах, rename
є один з Util-Linux і один з perl
називаються prename
.
rename 's/PMC// *.txt
іrename s/\.pdf// *.txt
Спочатку зробіть резервну копію своїх файлів! Тоді в основному ви можете використовувати однокласник 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
.
Спробуйте це:
for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done
У j=${i//\.pdf/}
засобі замінити .pdf
в $i
кориті. Аналогічно з другим завданням j позбавлення від PMC.
Якщо ви використовуєте zsh
, це типова робота для zmv
:
zmv 'PMC(*).pdf.txt' '$1.txt'
( zmv
витончено вирішує потенційні конфлікти).
.pdf
з імені файлу.