2015-12-17 53 views
3

該代碼在上述日期之後搜索並遞歸複製文件。如何讓這段代碼更短,更正確? (搜索和複製文件)

#!/bin/bash 

directory=~/somefolder 
DAYSAGO=8 

for ((a=0; a <= DAYSAGO ; a++)) 
do 
    find $directory -mtime $a -type f | while read file; 
    do 
     cp "$file" -t ~/The\ other\ folder/ 
    done 
done 
+1

順便說一句,在未來,對已經工作的代碼的反饋,請考慮Code Review StackExchange。在StackOverflow上,這種類型的問題通常被認爲是「太寬泛」。 –

回答

5

嘗試以下方法:

#!/usr/bin/env bash 

directory=~/'somefolder' 
DAYSAGO=8 

find "$directory" -mtime -$((DAYSAGO + 1)) -type f -exec cp -t ~/'The other folder'/ {} + 
  • 使用-的前綴-mtime觀點也適用低於邏輯該參數值。 全部find帶有數字參數的測試支持此邏輯(及其對應的+,對於多於邏輯)。 頂端的帽子到miracle 173
    • 因爲期望的邏輯是<= $DAYSAGO1使用算術擴展($((...))),以實現期望的邏輯被添加(不必說,$DAYSAGO可以用低於記邏輯重新定義,以9,所以爲了使算術擴展不必要)。
  • 使用-exec+終止調用與(通常)所有匹配的文件名一次,比輸送至一個外殼循環更有效的指定的命令。

  • {}是匹配的文件名列表中的佔位符,並注意與+必須+終止前的最後參數(相比之下,與調用一次,換每個匹配文件結束符\;{}可以放在任何地方)。

    • 注意的是,上述命令因此只與cp實現支持-t選項,它允許將所述目標目錄第一,值得注意的是,GNUcp(BSD/OSX cp和POSIX規範工作的,由相比之下,不支持-t)。
  • 還要注意在報價的變化:

    • directory=~/'somefolder':單引號字面somefolder - 雖然不是絕對必要在這種特殊情況下 - 確保封閉工程爲名,即使它包含嵌入的空格或其他shell元字符。

      • 但是請注意,該~/部分必須保持不帶引號~擴展到當前用戶的主目錄。
    • "$directory":雙引述可變參考確保其值不是由外殼進一步解釋,使其安全地使用具有嵌入的空白和其他shell字符路徑。

    • ~/'The other folder'/~/The\ other\ folder/提供了一個更清晰的替代方案(並且也更容易打字),展示了與上述相同的未引用部分和引用部分。

+1

我更喜歡我的解釋,但是這提示更好地使用'-exec',一次使用'+'來複制儘可能多的文件。 – chepner

+1

我不明白while循環,我想.mtime - $ DAYSAGO將覆蓋整個範圍。 – miracle173

+0

謝謝,@chepner。我還沒有得到解釋 - 現在補充說。 – mklement0

1

你不需要while循環可言。使用它時,會暴露出一些問題,例如包含換行符和其他空格的文件名。主要使用-exec

find "$directory" -mtime "$a" -type f -exec cp {} -t ~/The\ other\ folder/ \; 

更新:使用mklement0's answer,雖然;它更有效率。