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