2011-07-31 37 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