замена имени файла шаблоном

@gudmundur -Орн ответил правильно, но если вы используете BtrFS в Linux, то cp a --reflink=auto dirA dirBдолжно помочь, с той разницей, что файлы на самом деле разные, и изменение одного не меняет другого. Вы можете добиться в основном того же с cp -cна Mac с APFS(autoсделает полную копию, если это невозможно, -cне удастся ).

Любая файловая система COW должна это делать, но поставщики не согласовали стандартную опцию командной строки.

0
12.10.2020, 16:13
3 ответа

Это должно ускорить цикл в два раза, поскольку он переименовывает каждый файл непосредственно в окончательное имя.

for file in./*.dlg; do
    new=${file/_grid12_/_}
    mv -v "$file" "${new/_lig./.}"
done

Вы, вероятно, можете получить некоторое ускорение от параллельного выполнения переименований (, но IO может легко стать узким местом):

cpu_tally=$(grep -c ^processor /proc/cpuinfo)
for file in./*.dlg; do
    new=${file/_grid12_/_}
    printf '%s\0' "$file" "${new/_lig./.}"
done  | xargs -r0 -n2 -P$cpu_tally -exec mv -v
2
18.03.2021, 22:58

Медленно выполняется отдельная mvутилита для каждого файла. Вы можете переключиться на zsh, где утилиту mvможно сделать встроенной :

.
zmodload zsh/files # makes mv and a few other file manipulation utilities builtin
autoload -Uz zmv   # batch renaming tool
zmv -v '*.dlg' '${${f/_grid12_/_}/_lig./.}'

zmvимеет дополнительные возможности по сравнению с простым циклом. Например, он прервется до начала переименования, если обнаружит конфликты.

Простой цикл может быть:

for f (*.dlg(#qoN)) mv -vi -- ${${f/_grid12_/_}/_lig./.}

Здесь также добавлен квалификатор (#qoN)glob для отключения сортировки.

1
18.03.2021, 22:58
touch 1300_grid12_04_lig_cne_767_lig.dlg
# if you have few
parallel mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}' ::: *.dlg
# if you have thousands
printf "%s\0" *.dlg |
  parallel -0 mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}'
ls 1300*dlg
0
18.03.2021, 22:58

Теги

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