【问题标题】:Directory check and mv command目录检查和 mv 命令
【发布时间】:2015-05-21 15:04:45
【问题描述】:

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

我知道这是可能的,但我的“如果”和“那么”混淆了。这是我到目前为止所做的:

    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 个或更多目录串起来,以便在一个脚本中检查和移动。

【问题讨论】:

  • 请不要使用 cmets 为您的问题添加更多细节;相反,edit它。
  • @TomFenech 抱歉,我确实意识到了我的错误并转移了它,我还是这个论坛的新手,已经习惯了它的方式/功能。一如既往的感谢
  • @TomFenech 文件夹更改为目录

标签: bash unix move


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的快速回复,我应该说我检查的每个文件夹都有一个相应的文件夹,内容需要移动到一个已放置的文件夹才能接收所有内容。
  • 输入目录和输出的映射关系是什么?这些名字是相关的还是什么?你应该编辑你的问题来解释。
【解决方案2】:

使用Checking from shell script if a directory contains files中的漂亮答案by mweerden,你可以说:

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
$ 

【讨论】:

  • 值得一提的是,这依赖于 GNU find for -maxdepth
  • 好点,@TomFenech。更新以表明它可以以不同的方式完成......事实上,不,我不能这样做,因为它会变得很奇怪。我考虑过find dir/ -type f,但我们可能还想检查该目录中的目录等。
  • 感谢您的快速响应和多种解决方案,我是否将 aaa 替换为要检查的文件夹的路径?我是否只是对所有后续文件夹重复该命令?
  • @ImagineAdmin 因为您要在此处和其他答案中的 cmets 中添加有关您的问题的更多信息,所以最好更新您的问题以显示更多上下文。
【解决方案3】:

我想办法做到这一点:

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 做一些事情,如果全局扩展失败,它将退出。然后,您也许可以使用该输出来测试该目录中是否有任何文件。

【讨论】:

    【解决方案4】:

    感谢您的所有建议,由于我的编程技能非常有限,我尝试了所有各种排列但没有成功。我发现权限在其中发挥了作用,因此添加了 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
    

    但不能让它工作,我敢肯定人们正在拉扯他们的头发,看着我的伪劣编码,但我知道我很接近,因为移动命令部分工作正常,只是在检查文件夹后它不是然后移动它找到的任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 2016-03-15
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多