Bash: Найти указанные c файлы и вырезать последние 5 символов из имени - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть несколько файлов в папке ./, например:

$ ls
XX
AArse
BArse
CCCAArse
YY
....

После какая-то команда Я хочу:

AA
BA
CCCAA

Т.е. если конец имени файла содержит rse, файл переименовывается (чтобы удалить rse из его имени).

Как реализовать некоторую команду в bash?

Ответы [ 3 ]

3 голосов
/ 05 апреля 2020

С bash:

shopt -s nullglob
for file in *rse; do
  mv -i "$file" "${file%rse}"
done

Параметр оболочки nullglob расширяет несоответствующий шаблон глобуса до пустой строки, а расширение параметра ${file%rse} удаляет самый короткий суффикс rse из имя файла.

Параметр -i предлагает перезаписать уже существующие файлы.

3 голосов
/ 05 апреля 2020

С помощью Perl автономной команды rename, регулярного выражения и глобализации bash:

rename -n 's/...$//' *rse

В некоторых дистрибутивах rename также называется prename. Если все выглядит хорошо, удалите -n.

0 голосов
/ 05 апреля 2020

Чтобы дать чуть более обобщенный c ответ:

искатель. sh:

#!/usr/bin/env bash
usage() {
  echo 'Usage: ./finder.sh string_to_remove'
  exit
}

if [ "$#" -ne 1 ]; then
  usage
fi

check_string=$1
counter=0
for file in ./*
do
  if [[ -f $file ]]; then
    if [[ $file == *"$check_string"* ]]; then
      mv -v "$file" `echo $file | sed "s/$check_string//"`
      let "counter++"
    fi
  fi
done

if [ ! "$counter" -gt 0 ]; then
  echo "No files found containing '$check_string'"
else
  echo "$counter files effected with string '$check_string'"
fi

Затем вы можете использовать его с разными подстроками в следующим образом (после выполнения chmod +x finder.sh):

./finder.sh any_string
# Removes 'any_string' from all filenames

Примеры:

Со следующим списком каталогов:

$ ls
AArse  
AByfl  
BArse  
CCCAArse
XX
YY

вы можете запустить

./finder.sh rse; ./finder.sh yfl

, чтобы получить следующий вывод:

renamed './AArse' -> './AA'
renamed './BArse' -> './BA'
renamed './CCCAArse' -> './CCCAA'
3 files effected with string 'rse'
renamed './AByfl' -> './AB'
1 files effected with string 'yfl'

, чтобы ваш каталог теперь выглядел следующим образом:

AA
AB
BA  
CCCAA
XX
YY

Конечно, вы можете захотеть встроить некоторые проверки на потенциальные перезаписывается при использовании команды mv.

...