【问题标题】:Move directories less than 1G移动目录小于1G
【发布时间】:2016-07-23 00:32:57
【问题描述】:

我正在尝试移动小于 1GB 的所有目录。我正在尝试使用此命令:

du -h -d 1 -t -1G | xargs -0 mv -it /destination/dir/

但我收到一条错误消息:

mv: cannot stat [...] File name too long

非常感谢您的帮助:)

【问题讨论】:

  • 尝试将-L 1 添加到xargs:du -h -d 1 -t -1G | xargs -0 -L 1 mv -it /destination/dir/
  • 谢谢 :) 我尝试使用 -L 1,但会生成以下错误消息,mv: cannot stat ‘du -h -d 1 -t -1G\n’: No such file or directory 我也尝试使用 -n1,但这也给了我错误消息 mv: invalid option -- 'h'

标签: linux shell xargs mv du


【解决方案1】:

我不确定您为什么要使用 -0 参数到 xargs,因为它指定文件名由空字节而不是空格分隔。 du 的输出不会包含任何空字节,因此整个输出将被视为单个文件名,从而导致您看到的错误。

无论如何,我建议使用find

find /path/to/source -type d -size -1024M -exec mv -it /path/to/destination {} +

如果您很高兴du 已经产生了您想要的输出并且想要使用它,您可以添加-0 开关以便它使用空字节分隔符,然后您当前的xargs 命令应该工作。

【讨论】:

  • 谢谢 :) 不幸的是,我完全无法让find屈服于我的意愿。如果我只是在-exec 之前运行所有内容来检查输出,它似乎会忽略-type d 标志并简单地输出每个小于1024M 的文件。
  • 也许您可以将-0 开关添加到du(请参阅我的更新)。
  • 现在我们已经非常接近了!唯一的问题是du 正在输出通过管道传送到mv 的目录大小,显然mv 不再识别目录名称。
  • 是的,您的命令输出在我的系统上看起来也不正确,这就是为什么我建议首先使用find。我不确定为什么它不适合你。
  • 这让我相信我可以使用sed 删除数字,例如:du -d 1 -t -1G -0 | sed 's/[0-9]*//g' | xargs -0 mv -it /destination/ 不幸的是这产生了另一个错误:mv: cannot stat ‘\t./Crank’: No such file or directory 无论如何,我真的很想得到find 工作,但由于某种原因,我的运气更差。
【解决方案2】:

所以这里有一个可以满足我需求的解决方法。也许有人可以扩展它?无论如何,如果您不需要担心子目录,那么以下工作。

du -Sb -t -1G | cut -f 2- | xargs -d "\n" mv -t /path/to/destination/

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2019-08-02
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多