Как пакетно удалить расширения файлов на Mac с помощью CSH или Bash?

852
Yaqian Huang

Я ошибочно добавил .dcmрасширение для всех файлов на моем Mac, что привело к невозможности войти в систему на моем iCloud и в хранилище цепочек ключей.

Будучи настолько отчаянным, чтобы узнать решение восстановить свои первоначальные расширения файлов, но я только нашел ответы заменить .abcс .defрасширениями, которые не хочу. Я хочу удалить все избыточные .dcmрасширения, добавленные в каждый файл.

Есть ли способ просто удалить расширения .dcm для всех файлов (рекурсивно)?

Вот решения для замены файлов-исключений, которые я нашел:

for file in *.abc; do mv "$file" "$"; done for old in *.abc; do mv $old basename $old .abc.ef; done 

Они либо не рекурсивны, либо Bash (3.2x) говорит «плохая замена» / «команда не найдена».

3
Мне интересно, какие ответы вы нашли, которые объясняют, как заменить что-то, но что не позволит вам просто удалить расширение? slhck 7 лет назад 1
несколько ... так как эти вопросы о том, как заменить одно расширение файла другим, например .abc на .def, ответы похожи на "для файла в * .abc; do mv" $ file "" $ .def "; сделано Yaqian Huang 7 лет назад 0
Вам приходило в голову просто удалить `.def` из найденных вами примеров? Bash здесь ничего не заменяет ... он удаляет `.abc`, а затем вы добавляете` .def`. Так что вы могли просто пропустить часть "add` .def` ". slhck 7 лет назад 1
Да, и Баш говорит плохую замену Yaqian Huang 7 лет назад 0
и это не рекурсивно, а также Yaqian Huang 7 лет назад 0
Я нашел другие как для старых в * .txt; do mv $ old `basename $ old .txt`.md; сделанный. Удаление MD также не работает .. Yaqian Huang 7 лет назад 0
Я сомневаюсь, что код, который вы показали, выдает ошибку «плохой замены». На самом деле это не рекурсивно, но это можно легко изменить. Было бы полезно, если бы, когда вы задаете вопрос, явно добавили все, что вы пробовали, и объясните, почему это не сработало. Вы можете [редактировать] свой пост, чтобы сделать это - комментарии не так полезны для таких вещей. slhck 7 лет назад 0

1 ответ на вопрос

4
slhck

Это должно сделать это:

find / -type f -name '*.dcm' -exec sh -c 'mv -- "$0" "$"' {} \; 

Команда:

  • Рекурсы из /
  • Находит каждый файл с именем *.dcm
  • Выполняет небольшой вызов subshell с одним аргументом filename ( {})
  • … Который переименовывает файл ( $0), используяmv
  • удаление самый короткий матч ( %) в .dcmиспользовании манипуляций со строками

Положите echoперед, mvчтобы увидеть, что он будет делать.

Если вы хотите работать без подоболочки, вы можете передать while:

find / -type f -name '*.dcm' -print0 | while IFS= read -r -d '' filename; do mv -- "$filename" "$" done 
Большое спасибо! Я буду играть с этим немного больше. И я только что нашел другое рабочее решение: find / path / to / your / files -name '* .dcm' | пока читаешь fname; сделать mv "$ fname" "$ " готово Yaqian Huang 7 лет назад 0
Это тоже хорошо, но не так надежно. Смотрите мой ответ для лучшего решения, которое обрабатывает всевозможные пробелы в именах файлов. (Bash это странно, но это необходимо: https://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names) slhck 7 лет назад 0
во время выполнения есть строка: `переопределить r -------- Apple / staff для /Users/Apple/Library/Keychains/.fl0D1D1BA9? (y / n [n]) `Я не понимаю содержание. Думаю, я должен ударить [n]? Yaqian Huang 7 лет назад 0
Да, и тот, кто с `echo` работает потрясающе! Yaqian Huang 7 лет назад 0