2011-07-31 38 views
8

此脚本将按日期对文件进行排序,然后将第一批2500个文件移动到另一个目录。
当我运行下面的脚本,系统提示出参数列表太长味精。任何人都可以帮助我改进脚本?谢谢参数列表太长 - Unix

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" 
+1

您是否只想移动第一批2500个文件? – Sujoy

回答

1

首先创建待处理文件的备份列表。然后逐行读取备份文件并将其修复。例如

#!/bin/bash 
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 -2500 > list 
exec 3<list 

while read file <&3 
do 
    mv $file $DESTINATION_DIRECTORY 
done 
+0

谢谢你的回复,我没有明白你的意思。对于unix来说,新的功能是什么? – user871695

+0

用户:我更正了我的答案。感谢您的满意和满意! – Bytemain

+0

同样的错误 - 参数列表太长味精。 Fyi $ FROM_DIRECTORY包含> 200k文件 – user871695

0

一个快速的方法来解决,这将是更改为$ FROM_DIRECTORY,这样就可以使用参考(短)的相对路径的文件。

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

这也并非完全防呆,如果有匹配的文件太多。

+0

感谢您的回复,我会稍后再测试 – user871695

+0

同样的错误 - 参数列表太长味精。 Fyi $ FROM_DIRECTORY包含> 200k个文件 – user871695

3

你不说,但我以为这是哪里出现问题:(您可以通过添加“设置-x”你的脚本的顶部验证)

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

问题在于内核具有给予新进程的命令行总长度的固定最大值,并且超出了ls命令中的最大值。你可以解决它不使用通配符,而是使用grep

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

grep使用正则表达式,而不是水珠,这样的图案看起来有点不同。)

+0

感谢您的回复,我会稍后再测试它。 – user871695

+0

同样的错误 - 参数列表太长味精。 Fyi $ FROM_DIRECTORY包含> 200k个文件。 – user871695

+0

这很奇怪。如果你可以使用“set -x”提供运行输出,我们可以肯定,但是我最好猜测的是你要么给星号加了一个星号,要么在xargs上出了问题。如果是后者,请将-n10添加到xargs选项。 – 2011-08-02 07:37:44

2

变化

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

做类似如下:

find "$FROM_DIRECTORY" -maxdepth 1 -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]\n' | sort -k2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs mv -t "$DESTINATION_DIRECTORY" 

这种利用找个创建与修改时间戳的文件列表,排序由时间戳,则输出传递到headxargs

编辑

另一种变型之前删除不需要的领域,应该与非GNU utils的工作

find "$FROM_DIRECTORY" -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]' |sort -k 2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs -i mv \{\} "$DESTINATION_DIRECTORY" 
+0

感谢您的回复,我会稍后再对其进行测试 – user871695

+0

@user:确实没有必要确认每个答案 – Hasturkun

+0

我运行命令,它没有工作。我找到了$ FROM_DIRECTORY/-name'MSCERC * .Z'|来更改脚本头-2500 | xargs -i sh -c“mv {} $ DESTINATION_DIRECTORY”。它成功地将这些文件移至destinaton目录。我的问题是,如何按日期排序文件,以便系统可以读取前2500个文件? – user871695