我希望以下内容将所有文件硬链接到目标,但定义的目录除外。查找工作正在运行,但它不会复制任何文件。
#!/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,因为我想在目的地创建硬链接。提前谢谢!
答案 0 :(得分:2)
我猜你知道为什么"$2"
没有出现在任何地方,所以我们只会假设你是正确的。您还了解,无论source
发现了哪些文件名,您找到的每个文件"$3"
(例如$dest
)都会链接到find
,因为您没有使用"$line"
1}}用作while read line
循环变量。从问题中可以看出,您想要链接source
dest
中的所有文件(您必须确认这是您的意图)如果是这样,find
本身就是您所需要的,例如
find source -maxdepth 1 ! -name "dir1" ! -name "dir2" -execdir cp -lr '{}' "$dest" \;
将找到1级的所有文件(和目录)并硬链接dest中的每个文件。如果那不是您的意图,请告诉我,我很乐意进一步提供帮助。你原来的帖子有点不透明的炖壳......
答案 1 :(得分:0)
试试这个
#!/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
仅针对dir中的文件尝试以下代码
find $source -maxdepth 1 -type f -exec sh -c "ln -f \"\$(realpath {})\" \"$dest\$(basename {})\"" \;
你不能用硬链接文件夹。
答案 2 :(得分:0)
用简单的glob替换你的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