【问题标题】:Moving all directories which have a specified number of files, to another directory将具有指定文件数量的所有目录移动到另一个目录
【发布时间】:2013-12-01 00:36:29
【问题描述】:

如果问题不清楚,请道歉 -

我有大量(约 1000 个)目录,每个目录包含大约 4000 个文件。我正在运行一个脚本,该脚本对每个目录中的每个文件进行了复制(进行了一些修改),但是我的系统在它完成之前就崩溃了。现在我看到大约 200 个目录已“完成”,但我需要在剩余的 800 个目录上再次运行脚本。

我的问题是 - 有没有办法找出(并可能移动)所有文件数量超过指定数量的目录?我希望找到一种方法将所有包含约 8000 个文件的目录(即那些“完成”的文件)移动到其他路径,然后在剩余的目录上再次运行我的脚本。

我想应该有办法为此编写一个 bash 脚本,但我对 bash 脚本不是很熟悉,而且我无法在网上找到解决方案。到目前为止,我已经找到了如何找出每个目录中的文件数,但是如何根据它拥有的文件数对目录执行一些操作?

任何建议/指针表示赞赏。

编辑 - 我还阅读了 seq 实用程序,我可以用它来指定我想要移动的目录,但不幸的是,“完成”的目录不属于任何序列。

【问题讨论】:

    标签: linux bash terminal


    【解决方案1】:

    当然不清楚!

    假设你有

    ./base
    ./base/dir1
    ./base/dir2
    ./base/dir3
    ...
    

    您应该使用find,仅作为开始搜索的一种方式

    find ./base -type d
    

    您将需要一个脚本来计算每个条目中的目录,并需要一个测试来决定何时对目录采取行动。

    #make a list of dirs, and put one ata time in ONE_DIR variable
    find ./base -type d | while read ONE_DIR 
      do
      # count how many files/dirs there are into the current dir
      CONTENTS_NUM=$(ls -1 ${ONE_DIR} | wc -l) 
      # check if it is a upper 8000 elements dir
      if [[ "${CONTENTS_NUM}" -ge 8000 ]] 
      then
        #execute here whetever you want with this directory, you can add more lines if you need
        make_something ${ONE_DIR} 
      fi
    done
    

    【讨论】:

    • 我想我很困惑,因为我(现在仍然)有点不清楚如何在 bash 脚本中使用变量。谢谢你的回答,我试试这个。
    • 当我运行此脚本时,我收到一条错误消息 --- 第 4 行:[: too many arguments --- 我用谷歌搜索了它,显然如果正在比较的变量可能会出现此错误(此处为 CONTENTS_NUM ) 有空格或特殊字符。这显然不是这里的情况。知道为什么会出现这个错误吗?我在 if 块中所做的只是将 ONE_DIR 移动到另一个文件夹。
    • 我通过删除方括号之间的空格来修复错误。脚本现在运行,但什么也不做。
    • 已修复!现在可以使用 --- CONTENTS_NUM=$(ls -1 ${ONE_DIR} | wc -l)
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多