Как преобразовать файл в каталог? Файлы потеряны после find+mv

Это еще один способ, но с использованием Perl.

perl -i.bak -pe 's/[^[:ascii:]]//g' file
  • Флаг -i создает резервную копию исходного файла.
17
07.01.2020, 13:52
1 ответ

Добавление косой черты в конце пути назначения /opt/alfresco/archived/2020-01-07привело бы к ошибке команды mv, поскольку каталога 2020-01-07, очевидно, не существует. Это спасло бы ваши файлы.

Они также были бы сохранены, если бы /opt/alfresco/archived/2020-01-07был существующим каталогом (, независимо от того, есть ли косая черта в конце пути назначения или нет ), и ваши файлы были бы перемещены в этот каталог (конфликты имен файлов все еще могут быть проблемой, когда вы перемещаете файлы из нескольких каталогов в один каталог ). Это то, что вы хотели сделать. Что вы забыли сделать, так это сначала создать этот каталог.

Теперь, поскольку каталога не существовало, команда findбрала каждый отдельный файл XML и PDF, переименовывала его в /opt/alfresco/archived/2020-01-07, а затем продолжала делать то же самое со следующим файлом, перезаписывая предыдущий..

Файл /opt/alfresco/archived/2020-01-07теперь является последним файлом XML или PDF, найденнымfind.

Также обратите внимание, что, поскольку вы запускали команду findчерез /opt/alfresco, любой файл PDF или XML ниже этого пути, например, в любом каталоге ниже /opt/alfresco/archived, постигла бы та же участь.

Так легко совершить ошибку. Не существует удобного способа восстановить потерянные файлы, кроме как восстановить их из резервных копий.

Если вы не выполняете ежечасное резервное копирование своих данных, возможно, сейчас самое время начать это делать. Я бы порекомендовал resticили borgbackupдля резервного копирования личных файлов, предпочтительно на какой-нибудь сторонний -сайт или, по крайней мере, на внешнее хранилище.

Следующие вопросы и ответы могут быть вам полезны:

При следующем переписывании этого скрипта вы можете игнорировать подкаталог archivedи использовать mv -n -t. Вам также необходимо явно указать -printнайденные файлы (или использовать mv -v), так как findиначе не выведет их местоположение:

find /opt/alfresco \
    -path /opt/alfresco/archived -prune -o \
    -type f \( -iname '*.pdf' -o -iname '*.xml' \) \
    -exec mv -n -t /opt/alfresco/archived/2020-01-07 {} + \
    -print >/opt/alfresco/scripts/move.log

Несколько вещей из комментариев (ниже ), которые могут быть полезны:

  • Если GNU mvиспользуется с -t target, произойдет сбой, если targetне является каталогом. Вы можете использовать -exec mv -t /opt/alfresco/archived/2020-01-07 {} +для одновременного перемещения нескольких файлов с помощью find(, что также ускорит операцию ).

  • Если GNU mvиспользуется с -n, он откажется перезаписывать существующие файлы.

  • Ни -t, ни -nне являются стандартными (macOS и FreeBSD тоже имеют -n, хотя ), но это не должно мешать вам использовать их в сценариях, которые не должны быть переносимыми между системы.

50
27.01.2020, 19:46

Теги

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