$ awk -F';' '{file=substr($1,2)".csv";if(NR>1){print $0 > file}}' inputFile
Используйте substr
, чтобы получить имя файла и добавить к нему .csv
, и NR>1
, чтобы игнорировать заголовок и, наконец, записать в файл.
$ head *csv
==> 11.csv <==
"11;"Example";"200";"Descripcion here...";
==> 21.csv <==
"21;"Example2";"300";"Some here...";
Единственное правдоподобное различие между ls
в терминале и ls
в скрипте заключается в том, что вы использовали псевдоним ls
для передачи опции, которая требует не только чтения списка имен файлов, но и прочитать атрибуты файла. Вариант, вероятно, --color
. Чтение списка имен файлов требует чтения только из самого каталога, тогда как чтение атрибутов файла требует доступа к индексному узлу каждого отдельного файла (с помощью системного вызова lstat
). Поэтому, когда вы запускаете ls
в этом сценарии, в кэш попадают только имена файлов, а не их атрибуты. При первом запуске ls
в терминале или использовании файлового менеджера с графическим интерфейсом необходимо загрузить атрибуты.
Передайте те же параметры для ls
в вашем скрипте, которые вы используете на терминале.
10 секунд для отображения всего 700 файлов — это ненормально медленно. Размер файлов значения не имеет. Типичные современные системы начинают заметно замедляться только с десятками или сотнями тысяч файлов, если не больше.
Узнать в чем проблема можно запустив после перезагрузки:
strace -tt -o ls.strace ls /path/to/directory
Вывод ls
можно ускорить с помощью ls -U
, но, конечно, это меняет вывод.
700 файлов — это немного. Некоторого ускорения можно добиться, переписав все записи каталога :
.mkdir /tmpdir/on/the/same/filesystem
mv * /tmpdir/on/the/same/filesystem
mv /tmpdir/on/the/same/filesystem/*.
Но наиболее эффективным решением может быть автоматическое чтение каталога в фоновом режиме при загрузке.