Bash переименовывает файлы с дублированными именами файлов - PullRequest
0 голосов
/ 10 ноября 2019

Я допустил ошибку при перемещении некоторых из моих файлов, и после того, как я их переместил, они закончили с дублированными именами файлов с '-' в середине, например:

Robot arm fails - Robot arm fails.mp4
this-is-another-file - this-is-another-file.txt
document - here - document - here.pdf

Я хотел быудалить половину имени: например:

Robot arm fails - Robot arm fails.mp4 -> Robot arm fails.mp4

this-is-another-file - this-is-another-file.txt -> this-is-another-file.txt

document - here - document - here.pdf -> document - here.pdf

Я попробовал этот код:

find . -type f -name "*-*" -exec bash -c 'f="$1"; g="${f/*-/}"; mv -- "$f" "$g"' - '{}' \;

Но это не работает для файлов, которые содержат «-» в своем имени ..

Есть идеи, пожалуйста? Спасибо.

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

С bash это легко:

for fname in *; do
  # remove extension
  name="${fname%.*}"
  # extract the half and append extension
  echo mv -- "$fname" "${name::${#name}/2-1}.${fname##*.}"
done

Если его вывод выглядит хорошо, удалите echo.

0 голосов
/ 10 ноября 2019

Вот решение awk. Аналогично решению bash:

script.awk

{
    split($0,fileParts, "\\.[^.]*$", ext); # split file to fileParts and extension
    newFileName = "'" substr(fileParts[1], 1, length(fileParts[1]) / 2 - 1) ext[1]"'"; # new fileName is: half fileParts and append extension
    cmd = "mv '" $0 "' " newFileName; # create a rename bash commmand from origin file name ($0) and newFileName
    print cmd; # print bash command (for debug)
    #system(cmd); # execute bash command
}

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

Выполнить после проверки правильности,Замените #system на system и запустите снова.

работает:

find . -type f -name "*-*" | awk -f script.awk
...