как переименовать несколько файлов путем замены строки в имени файла? эта строка содержит “#\”

Существует несколько различных синтаксисов регулярного выражения. (\s*) соответствует последовательности пробела в Perl и многих других современных программах, которые подражают его regexes. Sed использует более старый вариант основных регулярных выражений, в которых круглые скобки обозначают себя и \(…\) используется для группировки. GNU sed (версия на Linux) имеет опцию -r использовать расширенные регулярные выражения (какой Perl regexes расширяется далее), вместо этого. Кроме того, | обозначает себя в BRE, но должен предшествоваться обратной косой чертой в ДО.

s/[ \t]\+|/|/ пробел замен сопровождается a | с GNU sed. Если Вы хотите совместимую POSIX команду sed, использовать s/[ ][ ]*|/|/ где каждая пара скобок содержит пространство и вкладку, как \t и \+ расширения GNU. Кроме того, s управляйте только заменами одно возникновение на строку: добавьте g снабдите суффиксом для замены всех случаев.

sed  -i 's/[ \t]\+|/|/g' DataStats0914.txt

47
13.04.2017, 15:13
11 ответов

Это не сложно, просто убедитесь, что покидайте OctoTORPE (#) во имя, подготовив обратную косулью (\).

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 
22
27.01.2020, 19:34

Не уверены, как в SED, но вы можете попробовать это в корпусе Bash:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

Объяснение:

  1. POLOPS через все имена файлов, совпадающих на шаблоне (Lucky- # U00A9NBC - *. JPG)
  2. Revames Fial с использованием команды MOVE (MV)
  3. использует нативную замену параметра Bash $ {var / pattern / dattern / Замена} для создания нового имени («$ {F / # U00A9 / Safe}»)

Подробнее о замене параметра (что очень недоиспользуется IMO): http://www.tldp.org/ldp/ ABS / HTML / PARMETER-DUSSITITION.HTML

12
27.01.2020, 19:34

Чтобы выйти из # из оболочки, просто используйте одинарные кавычки ( '#' ), двойные кавычки ( "#" ) или обратная косая черта ( \ # ).

Самым простым в вашем случае было бы использовать команду rename (если она доступна):

rename '#U00a9' safe *.jpg
18
27.01.2020, 19:34

Чтобы заменить # на что-то еще для имен файлов в текущем каталоге (не рекурсивно), вы можете использовать Утилита GNU rename :

rename  's/#/somethingelse/' *

Такие символы, как - , должны быть экранированы с помощью \ .

В вашем случае вы могли бы использовать

rename 's/#U00a9/safe/g' *

. Обратите внимание, что если вы хотите работать только с определенным набором файлов, например только с *. Jpg , настройте окончательный ввод, чтобы он соответствовал этому selection:

rename 's/#U00a9/safe/g' *.jpg

Чтобы выполнить тест перед фактическим изменением имен файлов, используйте флаг -n :

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

Для OS X переименование GNU может быть установлено с помощью homebrew : варить установить переименовать .

71
27.01.2020, 19:34

Другой вариант - использовать pyRenamer , приложение, созданное специально для пакетного переименования.

Его можно установить с помощью sudo apt-get install pyrenamer

Для получения подробных сведений об использовании см. его файл README на GitHub .

-1
27.01.2020, 19:34

найдите список файлов и замените ключевое слово. ниже пример

find. -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
42
27.01.2020, 19:34

Вот решение DTK, завернутое в многоразовую функцию bash:

function renameFilesRecursively () {

  SEARCH_PATH="$1"
  SEARCH="$2"
  REPLACE="$3"

  find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
      NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
      mv "${FILENAME}" "${NEW_FILENAME}";
  done

}

Вот как это можно использовать:

renameFilesRecursively /home/user/my-files apple orange
0
27.01.2020, 19:34

Приведенные выше примеры не работали в моей системе (CentOS 5.6 ), поэтому я нашел (возможно более системную -специфичную для системы )команду, которая работает (примечание :нужно экранировать '#' с \в командной строке):

rename \#U00a9 safe *.jpg

[Также :У меня пока недостаточно репутации, чтобы комментировать, поэтому в ответ на вопрос Нихила об использовании /gв rename 's/old_string/new_string/g'(, заданный в комментариях для другого ответа выше):

Используйте модификатор gдля выполнения «глобальной» замены (, то есть для замены старой строки _новой строкой _столько раз, сколько встречается старая строка _). В этом нет необходимости в моем ответе, потому что renameбудет применяться ко всем файлам, указанным с помощью *. См.https://www.computerhope.com/unix/rename.htmдля краткого объяснения этого и других модификаторов.]

1
27.01.2020, 19:34

На самом деле у renameесть опция именно для того, что называется --substили сокращенно -s. Нет необходимости использовать синтаксис регулярных выражений.

rename -s '#U00a9' 'safe' *

Если вы хотите заменить несколько вхождений, используйте --subst-allили -S.

Кстати, я только хотел заменить строку ничем (удалить ее из имени файла )... ну, у нас также есть опция для этого -d/--deleteи-D/--delete-all:

rename -d '#U00a9' *
0
27.01.2020, 19:34

Выполните следующие действия

ls Lucky-#U00a9NBC*.jpg 

Будут отображаться все jpgимена файлов сLucky-#U00a9NBC*

rename 's/Lucky-#U00a9NBC/Lucky-safeNBC/' *.jpg

После выполнения этой команды каждый Lucky-#U00a9NBCзаменяется на Lucky-safeNBC.

 ls Lucky-safeNBC*.jpg

Вы можете видеть, что все файлы переименованы

0
27.01.2020, 19:34

Я бы сказал, более вероятно, что #U00a9здесь означает символ U+00A9(©).

Если вы хотите вернуть его к ©, закодированному в кодировке локали, вы можете использовать perlварианты rename(, иногда называемыеprename):

rename '
  use Encode::Locale;
  use Encode;
  s/#U([0-9a-f]{4})/chr hex $1/gie;
  $_ = encode(locale_fs => $_)'./*'#'[uU]*
0
27.01.2020, 19:34

Теги

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