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