全文:我正在编写将所有文件从一个目录链接到另一个目录的脚本。新文件名将包含原始目录名称。我目前使用find
选项使用-execdir
。
这就是我想要的方式:
./linkPictures.sh 2017_wien 2017/10
它会在2017_wien_picture.jpg
中创建一个指向文件2017/10
的符号链接2017_wien/picture.jpg
。
这是我目前的剧本:
#!/bin/bash
UPLOAD="/var/www/wordpress/wp-content/uploads"
SOURCE="$UPLOAD/photo-gallery/$1/"
DEST="$UPLOAD/$2/"
find $SOURCE -type f -execdir echo ln -s {} $DEST/"$1"_{} ";"
打印:
ln -s ./DSC03278.JPG /var/www/wordpress/wp-content/uploads/2017/10/pokus_./DSC03278.JPG
这就是我想要的:
ln -s ./DSC03278.JPG /var/www/wordpress/wp-content/uploads/2017/10/pokus_DSC03278.JPG
如何实施?我不知道如何将basename
合并到strip ./.
答案 0 :(得分:2)
您可以将此find
与bash -c
:
find $SOURCE -type f -execdir bash -c 'echo ln -s "$2" "/$DEST/$1"_${2#./}' - "$1" '{}' \;
${2#./}
将从./
命令输出的每个条目中删除find
。$1
将 传递给bash -c
命令行。如果要处理大量文件,我建议使用此while loop
使用进程替换来加快执行速度,因为它不会为每个文件生成新的bash。此外,它还将处理带有空格和其他特殊字符的文件名:
while IFS= read -r file; do
echo ln -s "$file" "/$DEST/${1}_${file#./}"
done < <(find "$SOURCE" -type f -print0)
答案 1 :(得分:2)
要在basename
上运行{}
,您需要通过sh
执行命令:
find "$SOURCE" -type f -execdir sh -c "echo ln -s '{}' \"$DEST/${1}_\$(basename \"{}\")\"" ";"
这不会赢得任何速度竞赛(因为每个文件都有sh
),但它会起作用。
所有引用可能看起来有点疯狂,但为了使可能包含空格的文件安全起见,这是必要的。