'find -exec mv' пытается переместить тот же файл, который был перемещен ранее

Октет состоит из восьми битов; это позволяет избежать потенциальной двусмысленности термина «байт», который может (может )представлять размеры шрифта, отличные от восьми битов.

В мире POSIX права доступа к файлам представлены двенадцатью битами .

Из этого следует, что термин «октет» не может точно использоваться для прав доступа к файлам. Я подозреваю, что путаница возникает, по крайней мере в некоторых случаях, из-за того, что восьмеричные значения обычно используются для представления прав доступа к файлам, а термины «восьмеричный» и «октетный» очень похожи.

5
26.04.2021, 15:38
2 ответа

Вам нужно будет игнорировать резервную директорию, чтобы findне вошел в нее. Уже есть ответ , показывающий, как это сделать.

Однако при таком способе резервного копирования файлов вы можете потерять данные. Если два или более файла в разных подкаталогах имеют одинаковые имена, они будут перезаписывать друг друга поверх -в месте назначения в резервном каталоге.

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

Следующая команда использует rsyncдля копирования (без перемещения )всех файлов, имена которых содержат подстроку 2019в каталогbackup_2019:

rsync --itemize-changes --archive --prune-empty-dirs \
    --exclude='/backup_2019/***' --include='*/' --include='*2019*' --exclude='*' \
   ././backup_2019

Это позволит избежать поиска внутри ./backup_2019файлов или каталогов для передачи, но в противном случае будет скопировано все, что содержит подстроку 2019. Каталоги на цели, которые в конечном итоге пусты, удаляются. Все, что копируется, копируется в место под backup_2019, которое совпадает с расположением файла в текущем каталоге :

.

Пример:

$ tree -F
.
|-- dir1/
|   |-- file-1
|   |-- file-2019-A
|   `-- subdir/
|       |-- file-2
|       `-- file-2019-B
|-- dir2/
|   |-- file-1
|   |-- file-2019-A
|   `-- subdir/
|       |-- file-2
|       `-- file-2019-B
`-- dir3/
    |-- file-1
    |-- file-2019-A
    `-- subdir/
        |-- file-2
        `-- file-2019-B
$ rsync --itemize-changes --archive \
    --prune-empty-dirs \
    --exclude='/backup_2019/***' --include='*/' --include='*2019*' --exclude='*' \
   ././backup_2019
cd+++++++++./
cd+++++++++ dir1/
>f+++++++++ dir1/file-2019-A
cd+++++++++ dir1/subdir/
>f+++++++++ dir1/subdir/file-2019-B
cd+++++++++ dir2/
>f+++++++++ dir2/file-2019-A
cd+++++++++ dir2/subdir/
>f+++++++++ dir2/subdir/file-2019-B
cd+++++++++ dir3/
>f+++++++++ dir3/file-2019-A
cd+++++++++ dir3/subdir/
>f+++++++++ dir3/subdir/file-2019-B
$ tree -F
.
|-- backup_2019/
|   |-- dir1/
|   |   |-- file-2019-A
|   |   `-- subdir/
|   |       `-- file-2019-B
|   |-- dir2/
|   |   |-- file-2019-A
|   |   `-- subdir/
|   |       `-- file-2019-B
|   `-- dir3/
|       |-- file-2019-A
|       `-- subdir/
|           `-- file-2019-B
|-- dir1/
|   |-- file-1
|   |-- file-2019-A
|   `-- subdir/
|       |-- file-2
|       `-- file-2019-B
|-- dir2/
|   |-- file-1
|   |-- file-2019-A
|   `-- subdir/
|       |-- file-2
|       `-- file-2019-B
`-- dir3/
    |-- file-1
    |-- file-2019-A
    `-- subdir/
        |-- file-2
        `-- file-2019-B

13 directories, 18 files

Вы можете добавить --remove-source-filesв список опций rsyncдля выполнения «перемещения», а не «копирования» резервных копий файлов.

5
28.04.2021, 22:50

Вы должны игнорировать целевой каталог, который хотите исключить

find. -path './backup_2019' -prune -o -type f -name '*2019*' -exec mv {}./backup_2019 \;

Неявное И между операторами связывает более тесно, чем ИЛИ (-o), поэтому оно переводится как(пропустить, если путь соответствует./backup_2019)ИЛИ (mv, если у нас есть файлы, соответствующие*2019*).

6
28.04.2021, 22:50

Теги

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