записать все типы файлов в файл - Ubuntu - PullRequest
0 голосов
/ 15 января 2012

Я хочу записать тип файла для всех файлов в папке в файл.

Так вот, что я сделал

for xfile in *.*
do
file "x$file"  > values     
done

Но, к моему несчастью, он не работали сообщение об ошибке было

: command not found 
'/check.sh: line 3: syntax error near unexpected token `do
'/check.sh: line 3: `do

Может кто-нибудь, пожалуйста, помогите мне преодолеть это?

1 Ответ

5 голосов
/ 15 января 2012

Во-первых, ваша переменная равна xfile, но вы пытаетесь использовать переменную file, перед которой стоит литерал x.Я думаю, что x$file должно быть $xfile.

Во-вторых, вы выполняете команду file для каждого файла и перезаписываете файл values каждый раз, то есть появляется только последний.Вы можете исправить это, предварительно удалив файл и используя >> (добавление) вместо > (перезапись).

В-третьих, команда file отлично способна обрабатывать несколько аргументов, так что вы действительнонужно только:

file * >values

Также используется *, потому что *.* - штука для Windows / DOS - если вам нужны все файлы в UNIX-подобных операционных системах, * - правильная форма (или.* также, если вы хотите скрытые файлы).


И, наконец, ни одно из этих предложений не решит вашу актуальную проблему, которая почти наверняка связана с наличием DOS-стиль окончания строк в вашем файле.Это сообщение об ошибке соответствует почти идеально тому, что вы увидите в этом случае.

В моей системе, когда я вводю ваш скрипт с окончанием строки DOS, я получаю то же сообщение об ошибке (в основном).

Если вы введете od -xcb check.sh, вы, скорее всего, увидите что-то вроде:

0000020    0a0d    6f64    0a0d    6966    656c    2220    7824    6966
         \r  \n   d   o  \r  \n   f   i   l   e       "   $   x   f   i
        015 012 144 157 015 012 146 151 154 145 040 042 044 170 146 151

с символами \r, указывающими неправильные окончания строк.

Вы можете использовать ваш любимый (приличный) редактор для просмотра и удаления этих файлов или просто установить dos2unix с apt-get (хотя у вас это может уже быть) и сделать:

# sudo apt-get install dos2unix  ## only if you don't have it already.
dos2unix check.sh >check2.sh

, а затем использовать check2.sh.

Хотя, имейте в виду, однострочный:

file * >values

по-прежнему лучше, чем цикл for (но вы все равно захотите убедиться, что выиспользуется конец строки UNIX).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...