Переименование папок на основе словаря в форме файла CSV?

В Vim можно также просто сделать глобальную замену на запуске всех строк:

:%s/^/;/
1
04.01.2014, 16:27
2 ответа

Я использовал бы find для получения имен папок проанализируйте их с sed, grep соответствующий идентификатор и копия наполняют:

$ find . -mindepth 1 -type d | while read dir; do 
   id=$(echo "$dir" | sed 's/\.\/[[:alpha:]]*\([[:digit:]]*\)_[[:alnum:]]*/\1/'); 
   new_name=$(grep -w "$id" names.csv | cut -d ';' -f 1); 
   mkdir -p "$new_name" && mv -rv "$dir"/* "$new_name"/ && rmdir "$dir"; 
 done

Приемы

  • использовать mkdir -p который создаст каталог и выйдет тихо, если он будет существовать.
  • использовать grep -w на файле CSV, чтобы только получить те строки, которые содержат весь идентификатор, ограниченный несловесными символами. Тем путем Вы стараетесь не соответствовать обоим 1123 и 123 для идентификатора 123.
2
27.01.2020, 23:28
  • 1
    Это rmdir перестал бы работать, поскольку каталог не пуст, Возможно mv -v "$dir"/* "$new_name"/? Также потребность быть осторожными Вы не требуете . файлы из базового каталога при копировании/перемещении с * шарик. Идея № 2 –  Matt 04.01.2014, 19:09
  • 2
    @mindthemonkey, конечно, это закрыло бы лицо рукой. Фиксированный. –  terdon♦ 04.01.2014, 23:16

Принятие Ваших каталогов является всеми в соответствии с текущим рабочим каталогом, вот начальная точка (так протестируйте его прежде, чем работать в напоминании):

csvFile="/tmp/file.csv"

for d in ./*;
  # only work with directory
  [[ ! -d "$d" ] && continue

  # extract id from directory
  id="$(echo "$d" | sed 's/[[:alpha:]]*\([[:digit:]]*\)_[[:alnum:]]*/\1/')"

  # fetch new name
  nid="$(awk -F';' '/'"$id"'/ {print $1}' "$csvFile")"

  # merge all matching dir into one
  mv "$d" "$nid"
done

Утилиты

Сделал Вы смотрите на:

  • mmv: Массовое Перемещение и переименовывает;
  • zmv: a zsh модуль, которые позволяют людям делать крупный, переименовывает.
1
27.01.2020, 23:28
  • 1
    Хороший, но Ваш gawk будет соответствовать любым строкам, содержащим идентификатор, не только тех, которые имеют определенный идентификатор. Это будет соответствовать обоим foo123 и 123bar для идентификатора 123, например. Это также создаст подкаталоги вместо того, чтобы копировать файлы для второй папки с тем же целевым идентификатором. –  terdon♦ 04.01.2014, 17:17
  • 2
    Ваше описание не выставил возможность неоднозначного идентификатора. Я знаю, что мой сценарий не является решением, просто полезное суждение :) –  Édouard Lopez 04.01.2014, 17:31
  • 3
    , которое Это вполне ясно указано в OP. Это и показывают в примере и явно упоминают: "Сначала очевидная проблема: Несколько Ids могут отобразиться на единственное имя. Я решил бы это путем создания всех "новых" папок впереди и скопировал бы содержание папки вместо этого". –  terdon♦ 04.01.2014, 17:33

Теги

Похожие вопросы