2017-02-07 51 views
3

此代碼背後的想法是查找大於1KB(或1000字節)的目錄中的所有文件,將它們壓縮並從原始目錄中刪除它們。我能夠找出兩個單獨的命令,但不確定如何將輸出從第一個命令鏈接到第二個命令(如果有意義的話)?任何人都可以將我指向正確的方向嗎?如何在目錄中壓縮大於特定大小的文件?

# Initialize variables 
dir=~/Test 

# Change directory to $DIRECTORY 
cd "$dir" 

# Find all files in the current directory that are larger than 1000 bytes (1KB). 
find . -maxdepth 1 -type f -size +1000c | zip -mT backup 
+0

另請參閱超級用戶上的[如何查找大於/小於x字節的文件?](http://superuser.com/q/204564/173513)。 – jww

回答

2

我提供了一個存根,但我決定充實腳本。這仍然不會處理病態情況,如包含通配符的文件名。

#!/usr/bin/bash 
# the following line handles filenames with spaces 
IFS=' 
' 
backupfilename=backup; 

for file in $(find . -maxdepth 1 -type f -size +1000c) 
do 
    if zip ${backupfilename} -u "${file}" # test that zip succeeded 
    then 
    echo "added file ${file} to zip archive ${backupfilename}" 1>&2; 
    # add your remove command here; remember to use quotes "${filename}" 
    echo "file ${file} has been deleted" 1>&2; 
    fi 
done 

我唯一遺漏的就是刪除命令。您應該自己解決並仔細測試,以確保您不會意外刪除不想刪除的文件。

+0

這樣做,您還可以在刪除應該添加到歸檔文件的文件之前測試歸檔命令是否成功。 –

+0

如果目錄中有任何帶有空格或通配符的文件,則會失敗 - 這是由於分詞和匹配。 – codeforester

+0

要處理帶空格的文件名,請添加行... IFS =' ' ...在for循環之前。這表示只使用新行來分隔文件名。我將不得不用通配符來查看文件名。 –

4

使用-exec選項,而不是試圖管的下一個命令:

find . -maxdepth 1 -type f -size +1000c -exec zip -mT backup {} \; 

將創建包含匹配文件zip存檔。

+0

查看查找的手冊頁,我應該意識到這是一個選項。謝謝!我現在得到一個錯誤,'發現:路徑必須先於表達式' - 我的路徑應該是。 (當前目錄),它肯定在表達式之前,所以有關它爲什麼會彈出錯誤的任何想法? – IAspireToBeGladOS

+0

聽起來像是發生了一些shell擴展,通常如果某些東西(如路徑,變量等)未正確引用,則會發生此錯誤;其他原因也存在,但需要更具體的細節... –

相關問題