1

В OS X 10.8 у меня есть пара папок с изображениями, но не все файлы имеют правильное расширение, есть GIF-файлы с именем JPG и т.д.

У меня есть одна строка, которая делает работу для фактического каталога:

for f in * ; do type=$(file "$f" | tr "[A-Z]" "[a-z]" | awk '{print $2}') ; mv "$f" "${f%.*}.$type" ; done

Теперь я хотел бы использовать "поиск" вместо того, чтобы также искать подпапки, но я всегда терплю неудачу.

Есть намеки?

4 ответа4

0

В этом случае вы можете легко найти файлы, НЕ соответствующие расширению .jpg:

find . -type f -not "*.jpg"

Вы также можете просмотреть результаты и проверить, являются ли файлы на самом деле jpg:

find . -type f -not "*.jpg" | while read fname; do
  if [[ $(file $fname) == *"JPG"*]]
    then echo $fname
  fi
done
0

Я нашел этот способ для моего теста, но это не очень элегантно :-P

find . -type f -name "*.*" -exec sh -c 'name=$(basename {} | cut -d. -f1) ; type=$(file {} | tr "[A-Z]" "[a-z]" | cut -d" " -f2) ; mv `basename {}` "$name.$type"' \;
0

Из предыдущих комментариев, я думаю, вы ищете способ проанализировать результаты, не зацикливая их, используя только find:

find . -type f -not "*.jpg" -exec sh -c "if [[ $(file {}) == *'JPG'* ]] then; echo {}; fi" \;

0

Проще всего было бы включить рекурсивное сглаживание для файлов, например, в Bash:

shopt -s globstar
for f in **/*.*; do
    type=$(file "$f" | tr "[A-Z]" "[a-z]" | awk '{print $2}')
    mv -- "$f" "${f%.*}.$type"
done

Таким образом, вам не придется анализировать результаты find . Проблема в том, что если файлов слишком много, эта команда может завершиться ошибкой, поскольку она может превысить максимальный размер командной строки. Это связано с тем, что имена файлов в **/*.* Будут расширены Bash до выполнения команды.

Таким образом, альтернативой является использование find , отправка его вывода в while и read .

find . -type f -print0 | while IFS= read -r -d '' f
    type=$(file "$f" | tr "[A-Z]" "[a-z]" | awk '{print $2}')
    mv -- "$f" "${f%.*}.$type"
done

Некоторые рекомендации по работе со списками файлов см. По адресу : http://mywiki.wooledge.org/ParsingLs.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .