Как использовать команду linux find для замены специальных символов во всех именах файлов? - PullRequest
0 голосов
/ 04 апреля 2019

Я хочу заменить все специальные символы (i.e. _?:/)(\-\n\t) во всех именах PDF-файлов на пробелы.

Я не смог этого сделать, поэтому я просто попытался удалить их с помощью этой команды.

По некоторым причинам эта команда иногда работает для тестового примера, но не для других. Выдает ошибку mv: target не является каталогом, а также имена входных и целевых файлов совпадают (если нет специального символа для удаления).

find .  -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr -d '_:-'  ); mv $if $of ;' \;

Я ожидаю изменения имени файла:

    a:bc-de_(fg).pdf

Быть

    a bc de  fg .pdf

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

«mv: target is not a directory» вызвано пробелами в имени файла и может быть исправлено путем ввода имени файла в двойных кавычках.

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

find .  -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;
0 голосов
/ 04 апреля 2019

Просто эффективнее

find ~+ -regextype awk -iregex '.*/[^/]*[-_:()\t][^/]*\.pdf' -exec sh -c 'mv "{}" "`echo "{}"|sed -E "s/[-_:\(\)\t]+/ /g"`"' \;

также переименовывает такое: bc -_: d в 'a bc d'

0 голосов
/ 04 апреля 2019

В качестве альтернативы вы можете использовать sed:

find . -name '*.pdf' sh -c 'mv "$0" "$(sed "s/[-_:()]/ /g" <<< $0)"' {} \;

образцы файлов:

$ ls
'a:bc-de_(fg).pdf'  'f:sc-de_(fg).pdf' somefile

выходные файлы:

$ ls
'a bc de  fg .pdf'  'f sc de  fg .pdf'   somefile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...