【问题标题】:How to move folders of certain size in command line?如何在命令行中移动特定大小的文件夹?
【发布时间】:2014-12-09 00:57:34
【问题描述】:

在我的外置硬盘中,我有两个分区,一个用于 Mac,另一个用于 Windows (FAT32)。由于 Time Machine 备份,我的 Mac 分区几乎已满,我想将我的一些旧文件夹(其中是电影)从 Mac 分区移动到 Windows 分区。但是,FAT32 文件系统只允许每个文件小于 4GB。但我的一些文件夹包含大于 4G 的文件。我不想手动浏览每个文件夹,检查大小,然后复制并粘贴小尺寸的文件夹。

所以我的问题是:

移动小于4GB的所有文件夹(包括子目录)到新分区的命令是什么?和mv命令的选项有关系吗?

谢谢

--- 2014 年 12 月 7 日更新---

我跑了find . -mindepth 1 -type d -exec bash -c 'f="$1";set $(du -bs "$f"); \ [[ $1 -lt 4294967296 ]] && echo mv "$f" /dest-dir' - '{}' \; >> output.txt

以下是我输出的前几行:

Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.stZBByQJc0/Render
BASH=/bin/bash
BASH_ARGC=([0]="1")
BASH_ARGV=([0]=".")
BASH_EXECUTION_STRING=$'f="$1";set $(du -bs "$f"); \\\n        [[ $1 -lt 4294967296 ]] && echo mv "$f" /Volumes/WIN_PANC/movies/'
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="53" [3]="1" [4]="release" [5]="x86_64-apple-darwin14")
BASH_VERSION='3.2.53(1)-release'
CLICOLOR=1
COLORFGBG='15;0'

它们不是我要移动的文件夹。我做得对吗?

【问题讨论】:

  • 这些是文件系统的典型限制,而不是命令的限制。无论如何,野兽可能不依赖任何系统内置存储来存储此类媒体内容。获得一个像样的外部驱动器(例如 USB),在其上放置一个您的系统都可以读取的像样的文件系统,并且您再也不会遇到此类问题。
  • @arkascha:现代 FS 没有这样的限制。并且外部驱动器(通常)同样不可靠。
  • @KarolyHorvath 问题不在于驱动器,而在于文件系统。所以不要责怪驱动器。关于“现代”文件系统......这里的“现代”是什么,它有什么帮助?我们不知道 OP 使用的是什么文件系统。查看他的设置,我希望这是一个旧的安装。
  • @arkascha:1)我没有责怪驱动器。 2)OP具体说明了他使用的是什么FS。 3) 冷静下来
  • @KarolyHorvath 实际上,OP 指定了所涉及的两个文件系统之一。这已经解释了问题。我仍然读到您将此类问题归咎于驱动器:“外部驱动器(通常)同样不可靠。”。相信我:我很酷 :-)

标签: bash shell find mv


【解决方案1】:

您可以使用此find 命令列出文件大于 4GB 的目录:

find . -mindepth 1 -type d -exec bash -c 'f="$1"; read s _ < <(du -s "$f"); \
        [[ $s -lt 4194304 ]] && echo mv "$f" /dest-dir' - '{}' \;

如果您对列表感到满意,请在 mv 命令之前删除 echo

【讨论】:

  • 对不起。我没有把我的问题说得很清楚。我只想将所有小尺寸(小于4G)的文件夹(包括子目录)移动到一个新目录。你能解释一下你的命令吗?我知道-type d 说我想查找目录。它还会检查子目录,对吗?您能否解释一下其他部分,尤其是bash 之后的部分?谢谢。
  • 我跑了find . -mindepth 1 -type d -exec bash -c 'f="$1";set $(du -bs "$f"); \ [[ $1 -lt 4294967296 ]] &amp;&amp; echo mv "$f" /dest-dir' - '{}' \; &gt;&gt; output.txt。我看到的输出对我来说很奇怪(请参阅我更新的帖子)。对吗?
  • 正如目前答案中提到的,它只是回显那些大小du -hs folder 命令手动检查这些文件夹的大小,以验证此查找输出是否正确。
  • 我尝试了更新的命令。它报告:du: illegal option -- b usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k | -m | -g] [-x] [-I mask] [file ...]。你的意思是du -ds 而不是du -bs
  • ok 删除了-b(在我的系统上我有它的字节大小)。立即尝试更新的代码。
【解决方案2】:

使用以下代码可以为您做到这一点(对于文件 >4G

#! /bin/bash
my_files=`ls --almost-all -1v -s -A --block-size=G|sort|sed -e 's#^[0-4]*G##g' -e '$ s#.*##g'`
echo "$my_files" >> my_files.txt
while read -r file; do
echo "MOVING FILE : $file"
mv "$file"  "destination_location"
sleep 0.5
done < my_files.txt
rm -rf my_files.txt

注意:将您的目录更改为所有要复制的文件都存在于 终端 中,然后您可以从同一终端运行脚本。确保将“destination_location”替换为要将文件移动到代码中的目录。然后执行脚本。

注意:您必须更改目录并运行每个目录中的代码。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2015-02-13
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多