bash - 参数列表太长 - Unix

标签 bash unix scripting sh

此脚本将按日期对文件进行排序,然后将前 2500 个文件移动到另一个目录。
当我运行以下脚本时,系统提示 Argument list too long msg。任何人都可以帮助我增强脚本?谢谢

NUM_OF_FILES=2500
FROM_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in
DESTINATION_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in_load

if [ ! -d $DESTINATION_DIRECTORY ]  
        then  
                echo "unused_file directory does not exist!"  
        mkdir $DESTINATION_DIRECTORY   
        echo "$DESTINATION_DIRECTORY directory created!"  
else   
        echo "$DESTINATION_DIRECTORY exist!"    
fi  


echo "Moving $NUM_OF_FILES oldest files to $DESTINATION_DIRECTORY directory"  

ls -tr  $FROM_DIRECTORY/MSCERC*.Z|head -$NUM_OF_FILES |
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY"  

最佳答案

你没说,但我想这就是问题所在:

ls -tr  $FROM_DIRECTORY/MSCERC*.Z|head -2500 | \
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY"  

(您可以通过在脚本顶部添加“set -x”来验证它。)

问题是内核有一个固定的给定新进程的命令行总长度的最大长度,而你在 ls 命令中超过了这个长度。您可以通过不使用 globbing 而使用 grep 来解决它:

ls -tr  $FROM_DIRECTORY/ | grep '/MSCERC\*\.Z$' |head -2500 | \
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY"  

(grep 使用正则表达式而不是 glob,因此模式看起来有点不同。)

关于bash - 参数列表太长 - Unix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890632/

相关文章:

bash - 解密目录中的多个 OpenPGP 文件

bash - 为什么 bash 在 ERR 陷阱中退出 0 时抑制标准输出?

php - 在*nix中,什么原因导致top命令中出现 "sleeping"?

linux - 如何在 Unix shell 脚本中为任何目录结构构建文件夹路径

Linux bash 。 2条线有什么区别?

linux - OSX 和 chroot 无法找到/bin/bash

linux - 用于在文件列表中查找单词的 shell 脚本,所有文件都作为参数给出

windows - 在 BASH windows 上默认设置一个目录

linux - 如何防止 tar 提取覆盖符号链接(symbolic link)目录

shell - Unix命令错误