Как я могу скопировать все изображения во втором столбце файла CSV и поместить их в новую папку с именем images? В нем около 300 тыс. Изображений, поэтому мне интересно, есть ли быстрый способ для этого (как у меня 12 процессоров):
[jalal@goku cleaned_affenet_manually_annotated]$ head -5 modified_training_for_FER2013.csv
,subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
[jalal@goku cleaned_affenet_manually_annotated]$ wc -l modified_training_for_FER2013.csv
283903 modified_training_for_FER2013.csv
echo ",subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
" | sed -r '1d;s/,(.*\.jpg),.*/\1/' | while read f; do echo "copy $f to dir/$f"; done
Возможно, имена каталогов не существуют (689, 392, ...). Если вы хотите сгладить файловую иерархию, это возможно, но может привести к перезаписи. cp --parents
генерирует родительские каталоги, если они не существуют, афаик.
Работа на пути напрямую выглядела бы как
sed -r '...' modified_training_for_FER2013.csv | while ...
Использование 12 процессоров, на самом деле, мало чем поможет, поскольку узким местом должен быть File-IO, использование жесткого диска.
Это должно помочь:
sed -r '1d;$d; s/^.*\/(.*\.jpg),./\1/g' mona.csv | xargs -i cp {} /path/to/images
В случае, если файлы находятся где-то еще, но имеют свои имена в файле csv
, то для их перемещения выполните:
sed -r '1d;$d; s/^.*\/(.*\.jpg),./\1/g' mona.csv | xargs -i cp /path/to/files/{} /path/to/images
Информация:
1d;1$
: удаляет первую и последнюю строки