在find -execdir中删除./ from filename

时间:2017-10-08 10:29:49

标签: bash

全文:我正在编写将所有文件从一个目录链接到另一个目录的脚本。新文件名将包含原始目录名称。我目前使用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 ./.

2 个答案:

答案 0 :(得分:2)

您可以将此findbash -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),但它会起作用。

所有引用可能看起来有点疯狂,但为了使可能包含空格的文件安全起见,这是必要的。