Только список файлов;iconv и каталоги? - PullRequest
0 голосов
/ 29 мая 2018

Я хочу преобразовать кодировку некоторых csv-файлов в iconv.Это должен быть скрипт, поэтому я работаю с while; do done.Сценарий перечисляет каждый элемент в определенном каталоге и преобразует их в другую кодировку (utf-8).

В настоящее время мой сценарий перечисляет КАЖДЫЙ элемент, включая каталоги ... Итак, вот мои вопросы

  1. Имеет ли iconv проблему с каталогами или игнорирует их?

  2. И если есть проблема, как я могу только перечислять / искать толькофайлы?

Я пробовал Как перечислять только файлы в Bash? a ***./*** в начале каждого элемента, и это немного раздражает (а моя программа не 'это тоже нравится).

Другая возможность - ls -p | grep -v /, но это также повлияет на файлы с / в названии, не так ли?

Надеюсь, ты поможешь мне.Спасибо.


Вот код:

for item in $(ls directory/); do
   FileName=$item
   iconv -f "windows-1252" -t "UTF-8" FileName -o FileName
done

Да, я знаю, что входной и выходной файлы не могут быть одинаковыми ^^

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Использовать find напрямую:

find . -maxdepth 1 -type f -exec bash -c 'iconv -f "windows-1252" -t "UTF-8" $1 > $1.converted && mv $1.converted $1' -- {} \;
  • find . -maxdepth 1 -type f находит все файлы в рабочем каталоге
  • -exec ... выполняет команду для каждого такого файла (включая правильныйобработка, например, пробелов или новых строк в имени файла)
  • bash -c '...' выполняет команду в '...' в подоболочке (проще сделать последующие шаги, включая множественные расширения имени файла, таким образом)
  • -- прекращает обработку опций и обрабатывает все, что после --, в качестве аргументов для вызова.
  • {} заменяется на find с найденными именами файлов
  • $1 в команде bash заменяется первым (и единственным) аргументом, который {} заменяется именем файла (см. Выше)
  • \; говорит find, где-exec 'ed команда заканчивается.
0 голосов
/ 29 мая 2018

Основываясь на существующем вопросе, на который вы ссылались, почему бы вам просто не удалить первые 2 символа, т.е. ./?

  find . -maxdepth 1 -type f | cut -c 3-

Редактировать: я согласен с @DevSolar по поводу проблемы с пространствомв цикле.Хотя я думаю, что его решение лучше для этой проблемы, я просто хочу дать альтернативный способ выхода из космической проблемы цикла for.

   OLD_IFS=$IFS
   IFS=$'\n'
   for item in $(find . -maxdepth 1 -type f | cut -c 3-); do
   FileName=$item
   iconv -f "windows-1252" -t "UTF-8" FileName -o FileName
   done
   IFS=$OLD_IFS
...