目录检查和mv命令

时间:2015-05-21 15:04:46

标签: bash unix move

我想检查目录是否为空,然后将其移至另一个目录,然后转到下一个目录。

我知道这可能会让我的“if's”和“then's”混淆。这是我到目前为止所做的:

    if [ "$(ls -A /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP)" ]; then
       echo "Not Empty"
    else
       echo "Empty"
    fi
    mv -n /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP/* /Volumes/SAN\ CK1/Content\ King/2015/Magazines/Digital\ Photographer

此脚本的目的是按顺序检查20多个单独的内容目录,每个目录在另一个磁盘上有相应的目录,如果它在源目录中找到任何内容,则将其移动到目标目录。

一旦我理解了这一点,我需要将20个或更多目录串起来检查并移动到一个脚本中。

4 个答案:

答案 0 :(得分:2)

假设你有一个已知目录的列表,我会建议这样的方法:

for dir in path/one path/two path/three; do
    contents=( "$dir"/* )
    if [[ ${#contents[@]} -gt 0 ]]; then
        mv "${contents[@]}" /destination/dir
    fi
done

glob用于使用目录中的每个路径填充数组。如果数组的长度大于零,则所有文件都将移动到目标。

答案 1 :(得分:1)

使用by mweerden中精美的答案Checking from shell script if a directory contains files,您可以说:

if [ -n "$(find aaa/ -maxdepth 0 -empty)" ]; then
   mv -n /Folder/Source/* /Folder/Destination
fi

甚至更短:

[ -n "$(find aaa/ -maxdepth 0 -empty)" ] && mv -n /Folder/Source/* /Folder/Destination

[ -n "$variable" ]检查$variable的长度是否为非零。

解释

find ... -empty只输出给定目录的名称,如果它不包含任何内容。

$ mkdir aaa/
$ find aaa/ -maxdepth 0 -empty
aaa/

现在它不会打印任何内容:

$ touch aaa/bbb
$ find aaa/ -maxdepth 0 -empty
$ 

答案 2 :(得分:0)

我知道如何做到这一点:

if [[ ! -z $(find $dir -type f -type d) ]]
then
    echo "Directory Not Empty. Move the files."
fi

此测试用于查看find命令是否返回任何文件。注意我必须测试输出以查看是否没有文件。只要命令良好,find将返回退出代码0,即使没有找到任何内容。

if ! ls $dir/* > /dev/null 2>&1
then
    echo "Directory Not Empty. Move the files."
fi

请注意,在第二个测试中,我不使用[ ... ][[ ... ]]测试。如果$dir下没有任何内容,ls $dir/*将返回非零状态,我的if语句将会选择该状态。

这应该更有效率。我没有炮轰新命令,如果目的是查看目录下是否有任何条目,ls应该比find更快。如果我可以直接使用$dir/*而不打扰命令,那就太好了...我想你可以用shopt -s failglob做一些事情,如果全局扩展失败,它会退出。然后,您可以使用该输出来测试该目录中是否有任何文件。

答案 3 :(得分:0)

感谢所有的建议,由于我的编程技巧非常有限,我已经尝试了所有各种排列而没有成功。我发现权限有一部分可以在其中播放,因此添加了chown行,但必须以root身份运行,因此将行添加到sudoers文件中,以便在检查文件夹中的内容之前设置正确的权限。

到目前为止,我已尝试过:

sudo chown -R admin /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP if ! ls $(find /Volumes/Editorial\     Data/Photography/Digital\ Photographer/Content\ King\ DP/* > /dev/null 2>&1     then echo "Directory Not Empty. Move the files." mv -n /Volumes/Editorial\     Data/Photography/Digital\ Photographer/Content\ King\ DP/* /Volumes/SAN\     CK1/Content\ King/2015/Magazines/Digital\ Photographer fi 

以及:

sudo chown -R admin /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP if [ -n "$(find /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP/ -maxdepth 1 -empty)" ]; then mv -n /Volumes/Editorial\ Data/Photography/Digital\ Photographer/Content\ King\ DP/* /Volumes/SAN\ CK1/Content\ King/2015/Magazines/Digital\ Photographer fi

但无法让它工作,我相信人们正在把他们的头发拉出来看着我的伪劣编码,但我知道我很接近,因为移动命令部分工作正常它只是在检查文件夹之后它没有然后移动它找到的任何东西