无法在find命令的子shell中使用dirname

时间:2014-04-10 04:14:38

标签: bash shell find

我正在尝试创建一个可以将所有文件从一个目录移动到另一个目录的小脚本,并且我认为使用find将是最佳解决方案。但是,我遇到了一个问题,即使用子标记来表示' dirname'创建目标目录路径的价值。这不起作用,因为{}评估为'。' (一个点)在子壳内。正如我的脚本所示,find命令的-exec mkdir -p $toDir/$(dirname {}) \;部分是不起作用的。我想创建移动文件所需的所有目标目录,但我不能在子shell中使用dirname来获取目录路径。 这是脚本:

#!/bin/bash

# directory containting files to deploy relative to this script
fromDir=../deploy
# directory where the files should be moved to relative to this script
toDir=../main

if [ -d "$fromDir" ]; then
    if [ -d "$toDir" ]; then
        toDir=$(cd $toDir; pwd)
        cd $fromDir
        find * -type f -exec echo "Moving file [$(pwd)/{}] to [$toDir/{}]" \; -exec mkdir -p $toDir/$(dirname {}) \; -exec mv {} $toDir/{} \;
    else
        echo "A directory named '$toDir' does not exist relative to this script"
    fi
else
    echo "A directory named '$fromDir' does not exist relative to this script" 
fi

我知道你可以-exec sh -c 'echo $(dirname {})' \;,但有了这个,我就无法使用$ toDir变量。

任何人都可以帮我找出解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:1)

由于您似乎正在重新创建所有文件和目录,请尝试tar技巧:

mkdir $toDir
cd $fromDir
tar -cf - . | ( cd $toDir ; tar -xvf - )