Перемещение файлов в отдельные каталоги на основе группировки, определенной в файле CSV

СВЯЗАННЫЕ: Переместить все файлы с соответствующими префиксами в папку на основе списка CSV

У меня есть файл CSV с двумя столбцами (значения, разделенные запятыми), с заголовками:

"id","group" "F1256","old" "E51651","new" "X56369","new" "G5481369","old" "54564564T","old" "544-5F5","new" "1298FFF","old" "JKL-wew_w","new" 

И у меня есть эти файлы в одном каталоге:

 2014-12-15_T921_F1256.png E51651_hf_2018-9-19.jpg hf_oldX56369_15-10-2014.xml 2018-07_xx54564564T_hfdata.bmp G5481369oldbackup_2018-01-01.txt 

Я хочу использовать grep (или любой другой подобный инструмент) для этих файлов и сопоставить их имена с колонкой id моего CSV-файла. При совпадении (т. id Если id точно найден в имени файла), файл должен быть перемещен в соответствующий подкаталог group .

Поэтому в текущем каталоге должны быть созданы две папки, old и new и все эти файлы должны быть перемещены в соответствии с описанным условием.

РЕЗУЛЬТАТ

 old ├──2014-12-15_T921_F1256.png ├──2018-07_xx54564564T_hfdata.bmp ├──G5481369oldbackup_2018-01-01.txt new ├──E51651_hf_2018-9-19.jpg ├──hf_oldX56369_15-10-2014.xml 

Как я могу это сделать?

4 Solutions collect form web for “Перемещение файлов в отдельные каталоги на основе группировки, определенной в файле CSV”

Решение awk может быть:

 awk -F, 'NR>1 { group[$2]= group[$2]? group[$2] "* *" $1: $1 ;next } END { for (x in group) printf( "echo mv *%s* -t %s\n" , group[x], x ) }' infile.csv| sh 

Уберите echo если вы довольны результатом.

 . ├── infile.csv ├── new │  ├── E51651_hf_2018-9-19.jpg │  └── hf_oldX56369_15-10-2014.xml └── old ├── 2014-12-15_T921_F1256.png ├── 2018-07_xx54564564T_hfdata.bmp └── G5481369oldbackup_2018-01-01.txt 

это приведет к одновременному перемещению всех файлов, относящихся к соответствующей группе каталогов.
о объяснении awk , пожалуйста, посмотрите на мой недавний ответ .

Вы могли бы сделать это, сначала sed n xargs

  sed -e ' s/","/* /;s/^"/*/;s/"$//;1d ' | xargs -l sh -c 'mv $1 "$2"' _ 

Примечание: применяются все предупреждения, которые идут с использованием конвейера xargs, например, кавычки, пробелы и т. Д.

В Python:

 import csv, os, glob filenames = [] filedir = 'files' with open('filelist.csv', 'rb') as f: reader = csv.reader(f) filelist = list(reader) filelist.pop(0) for k, filename in enumerate(glob.glob(filedir + '/*')): filenames.append(os.path.basename(filename)) for (id, directory) in filelist: matches = [e for e in filenames if id in e] for (filename) in matches: if not os.path.exists(directory): os.makedirs(directory) os.rename(filedir + '/' + filename, directory + '/' + filename) 

Попробуй это:

  #!/bin/bash input_file="$1" base_dir="$2" delim="," while read -r line do id=${line%$delim*} group=${line#*$delim} mv *"${id}"* "$base_dir//$group" done < "$input_file" 

В этом примере входной файл процесса, который не содержит строку определения (первая) и id, group, не имеет кавычек

  • Как получить последнее вхождение строк между двумя шаблонами из файла?
  • Как удалить идентичные строки в одном файле из другого, используя sed?
  • Скрипт для преобразования времени эпохи в читабельный формат
  • Как удалить все комментарии из файла?
  • Используйте sed, чтобы хранить только части файла и изменять его порядок (на основе синтаксиса textWrangler grep)
  • sed - соответствие по октету IP и удаление строки
  • Добавить текст после определенной строки
  • Как удалить строки, содержащие IP-адрес?
  • Извлечь часть строки, используя grep
  • Не удается перенаправить вывод из sed
  • Команда sed не возвращает то, что я хочу
  • Linux и Unix - лучшая ОС в мире.