Bash, если затем CP как жесткие ссылки

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

#!/bin/sh
tag_select=$1
source=$3
dest="/backup/"

{
if [[ "$1" = "backup" ]]; then
    find . -mindepth 1 -maxdepth 1 ! -name "dir1" ! -name "dir2" | while read line
    do
        cp -lr "$3" "$dest"
    done
fi
}

Обратите внимание, я не хочу использовать rysnc, так как я хотел бы создавать жесткие ссылки в месте назначения. Заранее спасибо!

3 ответа

Решение

Я думаю, ты знаешь почему "$2" нигде не появляется, поэтому мы просто предположим, что вы правы. Вы также понимаете, что каждый файл, который вы найдете source (например "$3") будет связан с $dest независимо от того, какие имена файлов обнаружены find потому что вы не используете "$line" что вы используете в качестве своего while read line переменная цикла Как видно из вопроса, вы хотите связать все файлы в source в dest (вы должны подтвердить, что это ваше намерение) Если так, find само по себе это все, что вам нужно, например

find source -maxdepth 1 ! -name "dir1" ! -name "dir2" -execdir cp -lr '{}' "$dest" \;

который найдет все файлы (и каталоги) для 1-го уровня и жестко свяжет каждый из файлов в dest. Если это не было вашим намерением, пожалуйста, дайте мне знать, и я буду рад помочь вам. Ваши оригинальные посты были чем-то вроде непрозрачного котелка с ракушками...

Попробуй это

#!/bin/sh
tag_select=$1;
source=$2;
dest="/backup/";
if [ "$1" = "backup" ]; then
  find $source -mindepth 1 -maxdepth 1 ! -name "dir1" ! -name "dir2" -exec cp -lr {} "$dest" \;
fi

ваша команда должна быть

./code.sh backup source_folder_path

пример

./code.sh backup ~/Desktop

Попробуйте код ниже только для файлов в каталоге

find $source -maxdepth 1 -type f -exec sh -c "ln -f \"\$(realpath {})\" \"$dest\$(basename {})\"" \;

Вы не можете жестко связать папки.

Замените свой find команда с простым шаром; это также дает преимущество работы с любыми допустимыми именами файлов, а не только с теми, в которых нет перевода строки.

#!/bin/sh
tag_select=$1
source=$3
dest="/backup/"

if [ "$1" = "backup" ]; then
    for f in "$source"/*; do
        case $f in
            dir1|dir2) continue ;;
        esac
        cp -lr "$f" "$dest"
    done
fi
Другие вопросы по тегам