2012-04-15 2 views
2

Есть несколько имен файлов, которые содержат '?' Как вы знаете, у окон есть проблемы с такими персонажами. Я хочу, чтобы рекурсивно переименовать все файлы в папках, используя xarg. Напримеррекурсивно переименовывать файлы и удалять символ

09 - grand hall?_10.mp3 

должен быть

09 - grand hall_10.mp3 
+0

пока вы на нем, вы хотите удалить пробелы? – Shep

+0

не плохо. Что делать тогда? – mahmood

+0

и делает ли это решение _have to_ use 'xarg'? – Shep

ответ

1

for file in $(find folder -name '*.mp3'); do
  mv -v "$file" $(echo "$file" | tr ? _);
done


выше имеет пробельные вопросы; это лучше:

find folder -name '*.mp3' -exec echo "'{}'" \; |
  while read file; do
    echo -n "mv -v $file " && echo $file | tr ? _;
done | sh

Идея заключается в том, чтобы найти все файлы, а затем повторить их в кавычки. Выполните вывод в цикл while, который строит команду mv для каждого файла, а затем передает , что в новую оболочку.

Уродливый, но если вам не нравится ответ, вы не должны задавать вопрос. :-)

+0

пробелы вызывают шум. что делать, чтобы удалить их? – mahmood

+0

@AdamLiss Я исправил пару незначительных проблем с пробелом в '$ file' в этом, но он все еще имеет проблемы с повторным токенированием с' для файла в $ (find _folder_ -name '* .mp3') '. Возможно, вы захотите попробовать что-то, основанное на 'find -print0', на« read -d »,« – je4d

+0

@ je4d. Токенизация исправлена, форматирование имеет целью. Спасибо за помощь! –

1

Это ужасно некрасиво, но я воспринял это как личный вызов, чтобы найти один вкладыш, который будет работать. :-)

find folder -name '*.mp3' -exec \
  sh -c "echo -n 'mv \"{}\" ' && echo \'{}\' | tr ? _" \; | sh

Стратегия, чтобы найти файлы, использовать echo построить команду mv для каждого файла с его именем в кавычках, а затем трубы выход в оболочку.

+1

find: missing аргумент '-exec ' – mahmood

+0

@mahmood: Исправлено. Спасибо за улов! –

+0

Это самый элегантный ответ на этот вопрос. Благодаря! –

0

Это один вкладыш должен работать, даже если имена файлов содержат одиночные/двойные кавычки и пробелы:

(IFS=\0;find . -name \*\\?\* -type f -print0| while read -d '' f;do mv -v $f $(echo $f|tr -d \?);done) 

Пояснение: '?'

  1. find только поиск файлов, имена которых содержат
  2. установка \0 как разделитель в IFS, find (по -print0) и read (по -d '') может обрабатывать имена файлов, содержащие специальные символы, такие как одинарные кавычки, двойные кавычки, пробелы и т.д.
  3. самый дальний от центра Parenthese помещает всю команду выполнить в следовательно, сохраняет текущую оболочку IFS неповрежденной.
  4. . в скрипте может быть заменен любым другим каталогом.
  5. Этот скрипт имеет очень маленький улов: он может сломаться, если имя файла и имя его родителя содержат «?». Это можно было бы обработать, но скрипт станет немного более уродливым и менее читаемым.
Смежные вопросы