Как удалить один символ / букву из имени файла

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

Stain-A_1P.fastq  to Strain-A_1.fastq
Strain-A_2P.fastq  to  Strain-A_2.fastq

Я пробовал следующее:

rename 's/P//' *fastq
for file in *; do mv "$file" `echo $file | tr 'P' ''` ; done
0
20.06.2017, 15:00
2 ответа

С bashили любой другой оболочкой POSIX:

for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done
  • for f in *.fastqперебирает .fastqфайлы

  • ext="${f##*.}"получает(${f##*.})и сохраняет расширение файла как переменнуюext

  • ${f%?.*}получает часть до символа, который следует за одним символом до последнего.

  • mv "$f" "${f%?.*}.${ext}"выполняет операцию переименования с добавлением расширения с обрезанным префиксом

Это пробный -пробег;падение echoдля фактического действия:

for f in *.fastq; do ext="${f##*.}"; mv -- "$f" "${f%?.*}.${ext}"; done

Если у васrename(prename):

rename -n 's{^(./.*).(\..*)}{$1$2}s'./*.fastq
  • Мы используем жадное сопоставление с .*для сопоставления до последней части.

  • Первая захваченная группа содержит часть до предпоследнего символа перед.

  • Вторая захваченная группа содержит часть после последней .(, включая.)

Бросить -nдля реального действия:

rename 's{^(./.*).(\..*)}{$1$2}s'./*.fastq

Пример:

% ls -1d -- *.fastq
Stain-A_1P.fastq
Strain-A_2P.fastq

% for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done 
mv -- Stain-A_1P.fastq Stain-A_1.fastq
mv -- Strain-A_2P.fastq Strain-A_2.fastq

% rename -n 's{^(./.*).(\..*)}{$1$2}s'./*.fastq
rename(./Stain-A_1P.fastq,./Stain-A_1.fastq)
rename(./Strain-A_2P.fastq,./Strain-A_2.fastq)
1
28.01.2020, 02:45

Используйте renameкоманду:

for f in *.fastq; do rename 's/P\./\./' "$f" ; done

  • 's/P\./\./-perl выражение подстановки :удаляет P, за которым следует.(перед расширением файла)
0
28.01.2020, 02:45

Теги

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