2015-12-16 4 views
2

У меня есть много каталогов с файлами в нем:Рекурсивных вырезать файл суффикса в подпапках

large_fffd612bdc3fab_main

Я хочу, чтобы вырезать суффикс large_ из всех файлов в каталогах рекурсивны и получить имя fffd612bdc3fab_main

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

for f in `find . -depth -type f -name large_*`; do mv $f $(echo $f | cut -c1-); done; 

, но когда я пытаюсь работать с подпапок я получаю такую ​​ошибку:

mv: './fff97489a19e89_main/large_fff97489a19e89_main' and './fff97489a19e89_main/large_fff97489a19e89_main' are the same file 

Просьба сообщить. Спасибо.

ответ

2

Вы можете сделать это с помощью -exec и подоболочку:

find . -name large_\* -exec \ 
    sh -c 'f=$(basename "$1"); d=$(dirname "$1"); echo mv "$1" "$d/${f#large_}"' _ {} \; 

echo там только для тестирования. Убедившись, что выход выглядит так, как вы ожидаете, вы можете либо удалить echo и повторно, или просто труба это к другому sh (если имена файлов не содержат специальные символы, в этом случае трубопровод к sh не будет работать, но удаление echo будет).

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

  • для цикла по выходу find не является безопасным в целом, так и вредной привычки
  • echo ... | cut расточительно, медленно. Подстановка с ${name#large_} быстро
+0

Подсказка: 'ш -c '... {} ...' 'это [не безопасно] (https://github.com/koalaman/shellcheck/wiki/SC2156) вообще. Подумайте о переписывании на 'sh -c '... $ 1 ...' _ {}' –

+0

Фантастический совет, переработал его, спасибо! – janos

+0

Большое спасибо! – dezzinto

 Смежные вопросы

  • Нет связанных вопросов^_^